
    ɢiD                    nX   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlZd dlZd dlmZ d dlmZmZmZmZ d dlmZmZmZmZmZ d dlm Z  d dl!m"Z" d dl#m$Z$m%Z% d d	l&m'Z'm(Z( d d
l)m*Z* d dl+m,Z, d dl-m.Z. d dl/Z/d dl0m1Z1 d dl2Z2d dlm3Z3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZV d dlWmXZXmYZY d dlZm[Z[m\Z\m]Z] d dlZm^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZg d dlhmiZimjZjmkZkmlZlmmZmmnZnmoZompZpmqZq d dlrmsZsmtZtmuZu d dlvmwZw d dlxmyZymzZzm{Z{m|Z|m}Z}m~Z~ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZ  ej\                  e      Zejb                  je                  dd      Zejb                  je                  d d!      ZdZd"Zi Z G d# d$      Zd% Zed&efd'       Z ed(e)      Zd d*lmZ ej                  e       ej                  d+ e d,-      d,.       d d/lmZ  G d0 d1e«      Zej                  eë       ej                  e1e j                  j                  d2d3      4       d5efd6Zej                  d7      d8efd9       Z e"d:-      Zd;eːj                  _         ej                  g d<=      Zd> Zeeːj                  j                  d?<   d@ed5efdAZ G dB dCe$      Z G dD dEe$      ZdFdGdHdIdJdKdLdMdNdJdOdPdQdRdJdSdTdUdIdJdVdWdXd dJgZdFdYdZdIdJd[d\d]d^dJd_d`dadbdJdcdddedbdJdfdgdhd^dJdidjdkdNdJdVdldmd dJgZdFdndodpdJdqdrdsdtdJdudvdwdbdJdxdydzd^dJd{d|d}d~dJdVddd dJgZdFdnddpdJddddbdJdVddd dJgZdFdnddpdJdddddJdidddIdJdVddd dJgZڐdDdededededededefdZdefdZded5efdZd Zd ZdEdededefdZdEdededefdZdFdededededededededefdZdedefdZdGdedededededefdZdHdededed5efdZej                  d      d        Zej                  de      d8efd       Zej                  d      d8efd       ZdZej                  de       ee7      fdede*fd       Zej                  de       ee7      fd8ededede*fd       Zej                  de       ee7      fd8ededede*fd       Zej                  de       ee7      fd8ededede*fdĄ       Zej                  de      ej                  de      d ee7      fd8edededede*f
dȄ              Zej                  dɫ      d8efdʄ       Zej                  de       ee7      fd8ede*fd̄       Zej                  de      ej                  de      dId8edefdτ              Zej                  de      ej                  de      d ee7      fd8edede*fd҄              Zej                  de      d8efdԄ       Zej                  de      ej                  de      dId8edefdׄ              Zej                  dث      dل        Zej                  dګ      ded8efd܄       Zej                  dګ      defd݄       Zd5efdބZej                  d߫       ee7      fded8ede*fd       Zej                  d      dd ee7      fdeded8ede*fd       Zej                  d      d8efd       Z ej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fded8ede*fd       Zej                  de       ee7      fd8ede*fd       Zej                  de       ee7      fd8edede*fd       Zej                  de      d8efd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fd8ede*fd       Z	ej                  d       ee7      fd8ede*fd       Z
ej                  d       ee7      fded8ede*fd       ZdJd8edefdZej                  de      ej                  d e       ee7      dfd8ede*defd              Zej                  de      ej                  de       ee7      dfd8ede*defd              Zej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fde*fd       Zej                  d	       ee7      fd8ede*fd
       Zej                  d      defd       Zej                  d      d8efd       Zej                  d      d        Zej                  d      d8efd       Zej                  d       ee7      fdede*fd       Zej                  d      defd       Zej                  d      defd       Zej                  d      defd       Zej                  d      dddd ee7      fdededeҐdede*f
d        Zej                  d!       ee7      fd"ede*fd#       Zej                  d$       ee7      fd"ede*fd%       Zej                  d&       ee7      fd"ede*fd'       Zej                  d(       ee7      fd"ede*fd)       Zej                  d*       ee7      fde*fd+       Zej                  d,e       ee7      fd8ede*fd-       Z ej                  d.e       ee7      fded8ede*fd/       Z!d0 Z"ej                  d1       ee7      fde*fd2       Z#ej                  d3       ee7      fde*fd4       Z$ej                  d5       ee7      fd8ede*fd6       Z%ej                  d7      ddd ee7      fdeҐd8eҐdede*fd9       Z&ej                  d7       ee7      fd8ede*fd:       Z'ejQ                  d;       ee7      fd<ed8ede*fd=       Z)ej                  d;       ee7      fd<ede*fd>       Z*ej                  d?       ee7      fd8ede*fd@       Z+ej                  dA       ee7      fdede*fdB       Z,ej                  dC       ee7      fdede*fdD       Z-dKdedeҐdFeҐdGeېdHef
dIZ.ej                  dJ       e4dK       e5d       ee7      fdeҐdLee3   dFede*fdM       Z/ej                  dN      ddE ee7      fdeҐdFeҐdHede*fdO       Z0ej                  dP       ee7      fdede*fdQ       Z1ej                  dR       ee7      fdeҐdSede*fdT       Z2ejg                  dR       ee7      fdeҐdSed8ede*fdU       Z4ej                  dV       ee7      fdeҐdSede*fdW       Z5ej                  dX       ee7      fdeҐdSede*fdY       Z6ejQ                  dX       ee7      fdeҐdSed8ede*fdZ       Z7ej                  d[       ee7       e4dK      fdeҐdSede*d\e3fd]       Z8ej                  d^       ee7      fde*fd_       Z9ej                  dP       ee7      fdede*fd`       Z:dFdadbdcdddbdedfdbdgdhdbdVdidbgZ;	 	 dLdedeҐdjeҐdkeҐdlef
dmZ<ej                  dn       ee7      fded8ede*fdo       Z=ej                  dp       ee7      fdede*fdq       Z>ej                  dr       ee7      fdede*fds       Z?ej                  dt       ee7      fded8ede*fdu       Z@ej                  dv      dw        ZAej                  dx       ee7      fded8ede*fdy       ZBej                  dz       ee7      fdede*fd{       ZCej                  d|       ee7      fded8ede*fd}       ZDej                  d~      ded8efd       ZEej                  d       ee7      fdede*fd       ZFej                  d       ee7      fded8ede*fd       ZGej                  d       ee7      fdede*fd       ZHej                  d      defd       ZIej                  d      defd       ZJej                  d      defd       ZKej                  d      dMdeҐdefd       ZLej                  d      defd       ZMej                  d      dNdefd       ZNej                  d      d        ZOej                  d      defd       ZPej                  d      defd       ZQej                  d       ee7      fdede*fd       ZRej                  d       ee7      fde*fd       ZSej                  d       ee7      fdede*fd       ZTej                  de       ee7      fd8edede*fd       ZUej                  de       ee7      fd8edede*fd       ZVej                  d       ee7      fdede*fd       ZWej                  d      d; ee7      fdeҐdede*fd       ZXej                  d       ee7      fded8ede*fd       ZYej                  d       ee7      fdede*fd       ZZd Z[d Z\dIdZ]dDdZ^d Z_d Z`d Zaej                  d       ee7      fdede*fd       Zbej                  de      ej                  de       ee7      dfd8edede*defd              Zcej                  d       ee7      fded8ede*fd       Zdej                  d       ee7      fded8ede*fd       Zeej                  d       ee7      fded8ede*fd       Zfej                  d       e4dK      fdLee3   fd       Zgej                  d      defd       Zhej                  d«       ee7      fded8ede*fdÄ       Ziej                  dī       ee7      fded8ede*fdń       Zjej                  dƫ       ee7      fded8ede*fdǄ       Zkej                  dȫ       ee7      fdeҐdede*fdʄ       Zlej                  d˫       ee7      fded8ede*fd̄       Zmd͐dΐdϜdАdѐdϜdҐdӐdϜdԐdՐdϜd֐dאdϜdؐdِdϜdڜZnej                  d۫       ee7      fded8ede*fd܄       Zoej                  dݫ       ee7      fded8ede*fdބ       Zpej                  d߫       ee7      fdede*fd       Zqej                  d       ee7      fded8ede*fd       Zrej                  d       ee7      fded8ede*fd       Zsej                  d       e5d       e4dK       ee7      fdeҐdeҐd\e3de*fd       Ztej                  d       ee7      fdede*fd       Zuej                  d       ee7      fdeҐdede*fd       Zvej                  d      d        Zwej                  d       ee7      fdede*fd       Zxej                  d       ee7      fdede*fd       Zyej                  d       ee7      fded8ede*fd       Zzej                  d       ee7      fd8ede*fd       Z{ej                  de       ee7      fdede*fd       Z|ej                  de       ee7      fd8edeҐdede*fd       Z}ej                  d       ee7      fdede*fd       Z~ejQ                  d       ee7      fded8ede*fd       Zej                  d e      d8efd       Zej                  de      d8efd       Zej                  d       ee7      fde*fd       Zej                  d       ee7      fdede*fd       Zej                  d       ee7      fde*fd	       Zej                  d
e      d8efd       Zej                  de      d8efd       Zej                  de      d8efd       Zej                  de       ee7      fd8ede*fd       Zej                  d       ee7      fd8ede*fd       Zejg                  d       ee7      fded8ede*fd       Zej                  d       ee7      fdede*fd       Zej                  d       ee7      fdede*fd       Zej                  d       ee7      fde*fd       ZejQ                  d       ee7      fd8ede*fd       Zej                  d       ee7      fde*fd       Zej                  d       ee7      fd ede*fd!       Zej                  d       ee7      fd8ede*fd"       ZejQ                  d       ee7      fd ed8ede*fd#       Zej                  d       ee7      fd ede*fd$       Zej                  d%       ee7      fd8ede*fd&       Zej                  d'       ee7      fd ede*fd(       Zej                  d)       ee7      fd ede*fd*       Zej                  d+e       ee7      fd8ede*fd,       Zej                  d-       ee7      fd8ede*fd.       Zej                  d-       ee7      fd8ede*fd/       Zej                  d0       ee7      fd8ede*fd1       Zejg                  d2       ee7      fd3ed8ede*fd4       Zej                  d2       ee7      fd3ede*fd5       Zej                  d6       ee7      fd7ede*fd8       Zej                  d9       ee7      fdede*fd:       Zej                  d;       ee7      fde*fd<       Zej                  d=       ee7      fde*fd>       Zej                  d?       ee7      fde*fd@       Zej                  dA       ee7      fdede*fdB       Zej                  dC       ee7      fde*fdD       Zej                  dEe       ee7      fd8ede*fdF       Zej                  dG       ee7      fd8ede*fdH       Zej                  dG       ee7      fd8ede*fdI       Zej                  dJ       ee7      fdKede*fdL       Zejg                  dJ       ee7      fdKed8ede*fdM       Zej                  dJ       ee7      fdKede*fdN       ZdeҐdKefdOZej                  dP       ee7      fdKede*fdQ       ZdeҐdKefdRZej                  dS       ee7      fdKede*fdT       Zej                  dU       ee7      fdKede*fdV       Zej                  dW       ee7      fd8ede*fdX       ZdeҐdYeܐdZefd[Zej                  d\       ee7      fd8ede*fd]       Zej                  d^       ee7      fdede*fd_       Zej                  d`e       ee7      fded8ede*fda       Zej                  dbe       ee7      fd8ede*fdc       Zej                  dd       ee7      fd8ede*fde       Zej                  dd       ee7      fde*fdf       ZejQ                  dg       ee7      fdhed8ede*fdi       Zej                  dg       ee7      fdhede*fdj       Zej                  dk       ee7      fdhede*fdl       Zej                  dm       ee7      fd8ede*fdn       Zej                  dm       ee7      fd8ede*fdo       Zej                  dp       ee7      fdqede*fdr       ZdedeҐdheېdsefdtZej                  du       ee7      fded8ede*fdv       Zej                  dw       ee7      fd8ede*fdx       Zej                  dy       ee7      fd8ede*fdz       Zej                  d{       ee7      fdede*fd|       Zd}ZdeҐd~ede*d5efdZej                  de       ee7      fd8ede*fd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fdede*fd       Zej                  d       ee7      fdede*fd       Zej                  d       ee7      fded8ede*fd       Zej                  de       ee7      fd8edede*fd       Zg dZːdIdedeҐdefdZ̐dOdedeҐdedeҐdeǐdefdZej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fdede*fd       Zej                  d       ee7      fdeҐdede*fd       Zej                  d       ee7      fdeҐdede*fd       Zd dlҐZd dlӐZd dlԐZ eҐj                  d      j                         Zi Zd8efdZej                  de      ej                  de      dId8edefd              Zej                  d      d8efd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fd8ede*fd       ZejQ                  d       ee7      fded8ede*fd       Zej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fd8ede*fd       Zej                  d       ee7      fded8ede*fd       Zej                  d       ee7      fd8ede*fd       Zddddddd;d;d;d;dpddÐdĐdŐdƐdǐdȐdɜdʐdːd̐d͐dƐdΐdǐdɜdϐdАd̐dѐdƐdҐdӐdɜdԐddfdŐd֜dאdؐdِdŐdڐdǐdېdɜgdܜdݐdސddߐddd;d;d;d;dIddd̐dŐdddǐdɜddd̐d͐ddҐdӐdɜdddfd͐d֜gdܜddddddddEdEdEd;dNdddd͐dddddddѐdddgddddddddd;d;dEd;dddd̐dŐdƐd ddɜdddĐd͐dƐdd dɜdddĐdѐdƐdddɜd	d
dd͐ddddɜgddddddddd;d;dEd;dtddd̐dŐdڐdddɜddd̐dѐdڐdddɜdddĐd͐dƐddӐdɜdddĐdŐdƐdddɜgddd ddd!d"d#dEdEdEd;d d$d%d@dѐd&d&dgddd'd(dd)d*d;dEdEd;d+g dܜgZej                  d,       ee7      fd8ede*fd-       Zej                  d.e       ee7      fd8ede*fd/       Zej                  d0       ee7      fde*fd1       Zej                  d2       ee7      fdede*fd3       Zej                  d4       ee7      fd8ede*fd5       Zej                  d6       ee7      fd8ede*fd7       Zej                  d8       ee7      fdede*fd9       Zej                  d:       ee7      fd8ede*fd;       Zej                  d<       ee7      fded8ede*fd=       Zej                  d>       ee7      fd8ede*fd?       Zej                  d@       ee7      fd8ede*fdA       Zej                  dB       ee7      fd8ede*fdC       Zy(P      N)Path)asynccontextmanager)FastAPIRequestDependsHTTPException)HTMLResponseJSONResponseStreamingResponseResponseRedirectResponse)StaticFiles)Jinja2Templates)	BaseModelfield_validator)casetext)SessionEventSourceResponse)Optional)SessionMiddleware)
UploadFileFileForm)get_dbinit_dbSessionLocal)DomainPackagePackageRevisionJob	BuildTaskAugmentRoadmapItemBrandKitBrandKitAssetSiteProfileProjectContextGlobalContextAuraUserAppSettingsConceptConceptRevision	BatchPlan
FtpProfileFtpProjectBindingDeploymentLogSiteSnapshotChatConversationChatMessageMarketplaceListingLlmProviderLlmCredentialLlmModelLlmRoute)analyze_domainbuild_package)call_llm_textgenerate_imagecall_llm_stream)
call_llm_text_routedgenerate_image_routedcall_llm_stream_routedget_routing_dashboard_dataget_all_routes	set_routereset_routePIPELINE_STAGES	PROVIDERSget_provider_status)	get_default_blueprintvalidate_blueprintcalculate_completenessparse_imported_contentDEFAULT_SECTIONSSECTION_CATEGORIESVISUAL_ELEMENT_OPTIONSCONTENT_DEPTH_PRESETSblueprint_to_prompt_spec)get_augment_typessuggest_augmentsgenerate_augment_htmlvaluate_domain)build_default_profile_configSTARTER_PROFILESslugifyvalidate_profile_configget_sections_for_profileDISCOVERY_FIELDS_DEFAULT)extract_text_from_fileclassify_document_contentclassify_imagebuild_brandkit_contextIMAGE_EXTENSIONSDOC_EXTENSIONSCLASSIFICATION_LABELSIMAGE_CLASSIFICATIONSbuild_brandkit_summarycompute_gap_analysiscompute_image_suggestionsCLASSIFICATION_TO_SECTIONScompute_file_hashresolve_assets_for_sections)build_advisor_contextbuild_analysis_promptbuild_plan_promptbuild_batch_promptADVISOR_ANALYZE_STEPSADVISOR_PLAN_STEPSADVISOR_BATCH_STEPSCONCEPT_STATUSES)encrypt_passworddecrypt_passwordtest_ftp_connectiondeploy_via_sftpdeploy_via_ftpcollect_deploy_filesFTP_DEPLOY_STEPS)generate_full_graphics_packregenerate_assetget_graphics_pack_summaryLOGO_STYLESSEPARATOR_STYLESSITE_ESSENTIALSresolve_asset_by_id)generate_documentgenerate_tiercalculate_maximization_scoreDOC_REGISTRYTIERSget_tier_doc_types   zaura-job)max_workersthread_name_prefix   z
aura-batch   c                       e Zd ZdefdZy)
BatchStatebatch_idc                     || _         t        j                         | _        t        j                         | _        | j                  j                          d| _        y )NT)r   	threadingEventpause_event	stop_flagsetactive)selfr   s     &/sites/domain-asset-master/app/main.py__init__zBatchState.__init__^   s?     $??,"*    N)__name__
__module____qualname__strr    r   r   r   r   ]   s     r   r   c            	      d   t               } 	 | j                  t              j                         }|dk(  rt        ddddt	                     }| j                  |       t        D ]/  }t        |d   |d   |d	   d|d
         }| j                  |       1 | j                          t        j                  ddt        t              z    d       | j                          y # t        $ r2}| j                          t        j                  d|        Y d }~Gd }~ww xY w# | j                          w xY w)Nr   zDefault (Current Behavior)defaultz}Mirrors the current hardcoded Aura behavior exactly. All 16 section types, 4 depth presets, standard discovery questionnaire.   nameslugdescription
is_defaultconfigr   r   r   r   zSeeded z site profileszFailed to seed profiles: )r   queryr(   countrX   addrY   commitloggerinfolen	Exceptionrollbackerrorclose)dbexistingdefault_profspprofes         r   seed_site_profilesr   f   s   	B88K(..0q=&1 \35L FF< & "FF "= 1 h< t IIKKK'!c*:&;";!<NKL
 	
	  6
04556 	
s*   CC 	D((DD DD D/appc                |  K   	 t                t        j                  dd       ddlm} ddlm}  ||      }|j                         5 }|j                  d      rO|j                  d      D cg c]  }|d   	 }}d	|vr*|j                  t        d
             |j                          d d d        t        j                  d       t                t!                t#                d  t(        j+                  d       y c c}w # 1 sw Y   ]xY w# t$        $ r}t        j'                  d|         d }~ww xY ww)Nstatic/imagesTexist_okr   )inspect)enginedomainsr   default_nichez9ALTER TABLE domains ADD COLUMN default_niche VARCHAR(255)z!Database initialized successfullyzFailed to initialize database: F)wait)r   osmakedirs
sqlalchemyr   app.databaser   connect	has_tableget_columnsexecuter   r   r   r   recover_orphaned_jobscleanup_old_jobsr   r   r   job_executorshutdown)r   
sa_inspectr   	inspectorop_connccolsr   s           r   lifespanr      s    	
Od34'v&	^^ 	%""9-+4+@+@+KLa&	LL"$.OOD)d$efNN$	% 	78 
u% M	% 	%  6qc:;sS   D<AD 	%D.D:0D*;D %D<DDD 	D9D44D99D<z#Aura - Domain to Business Generator)titler   )routerz/staticstatic)	directory)r   )BaseHTTPMiddlewarec                       e Zd ZdefdZy)AuthGateMiddlewarerequestc                   K   |j                   j                  }|j                  d      s|dk(  s|dk(  s|j                  d      s|dk(  s|j                  d      s|j                  d      s|j                  d      s|j                  d	      sw|j                  d
      sf|j                  d      sU|j                  d      sD|j                  d      s3|j                  d      s"|j                  d      s|j                  d      r ||       d {   S t               rJ|j                  j                  d      }|s-|j                  d      rt        ddid      S t        dd      S  ||       d {   S 7 h7 w)N/static//login/healthzz	/api/job/	/api/jobsz/api/aura-core/z/api/mastermind/z/_dev_preview/z/_dev_admin/z/superadmin/z/api/superadmin//storefrontz/api/storefront/z/api/packages/site-audit/z/api/listing-copy/z/api/batch/usernamez/api/r   Authentication required  status_code.  urlr   )r   path
startswith_is_login_requiredsessiongetr
   r   )r   r   	call_nextr   r   s        r   dispatchzAuthGateMiddleware.dispatch   sA    {{??:&$(*:dj>PTXTcTcdoTptx  }H  uH  LP  L[  L[  \m  Ln  rv  rA  rA  BT  rU  Y]  Yh  Yh  iy  Yz  ~B  ~M  ~M  N\  ~]  ae  ap  ap  q  a@  DH  DS  DS  Tf  Dg  ko  kz  kz  {H  kI  MQ  M\  M\  ]o  Mp  tx  tC  tC  D_  t`  dh  ds  ds  tH  dI  MQ  M\  M\  ]j  Mk"7+++**:6H??7+'2K(LZ]^^'H#FFw''' , (s%   DE=E9A#E=4E;5E=;E=N)r   r   r   r   r   r   r   r   r   r      s    
(g 
(r   r   SESSION_SECRETzaura-dev-secret-change-me)
secret_keyreturnc                     t               } 	 | j                  t              j                  t        j                  dk(        j                         }|r!|j                  dk(  r	 | j                          y| j                  t              j                         }|dk(  r	 | j                          y	 | j                          y# | j                          w xY w)Nlogin_enabledtrueTr   F)
r   r   r,   filterkeyfirstvaluer   r+   r   )r   setting
user_counts      r   r   r      s    	B	((;'..{//QRXXZw}}. 	
 XXh'--/
? 	
 


s   AB> 2(B> >Chttpr   c                 2  K   	  ||        d {   }|j                  j                  d	d
      }| j                  j                  j                  d      sd|v r-d|j                  d<   d|j                  d<   d|j                  d<   |S 7 x# t         $ r}dt        |      j                  v sdt        t        |            v rNt        j                  d| j                   d| j                  j                          ddl	m
}  |dd      cY d }~S  d }~ww xY ww)NClientDisconnectzClient disconnected during  r   )r   i  zClient disconnected)r   contentcontent-type r   z	text/htmlz#no-cache, no-store, must-revalidatezCache-Controlzno-cachePragma0Expires)r   typer   r   r   warningmethodr   r   starlette.responsesr   headersr   r   )r   r   responseexcr   content_types         r   add_cache_controlr     s     "7++ ##'';L{{"":.+2M,Q)%/"&)#O , c!3!337ISQUVYQZ^7[NN88H'++JZJZI[\]45JKKsK   DB
 BB
 A4DB
 
	DA5DD	DDDDzapp/templatesT)extranl2br
sane_lists)
extensionsc                     | syt         j                          t        j                  t         j	                  t        |                   S )Nr  )md_converterreset
markupsafeMarkupconvertr   )r   s    r   jinja_md_filterr     s4    \11#d)<==r   mdr   c                 <   | sy | j                          }|j                  d      r|t        d      d  j                         }|j                  d      r|t        d      d  j                         }|j                  d      r|dd  j                         }|j                  d      r|d d j                         }|j                  d      r	 t	        j
                  |      }dD ]!  }||v st        ||   t              s||   } nS d}|j                         D ]-  }t        |t              st        |      t        |      kD  s,|}/ t        |      d	kD  r|}t        j                          t        j                  |      S # t        j                  t        f$ r Y Dw xY w)
Nr  z```markdownz```md```   {	content_markdownbody_markdownsales_letter_markdownsales_letterr  markdownletterr   bodyd   )stripr   r   endswithjsonloads
isinstancer   valuesJSONDecodeErrorAttributeErrorr  r  r  )r   cleanedparsedr   longest_valvs         r   render_markdownr9     s   djjlG-(#m,-.446'"#g,-(..0% !"+##%#2,$$&#	ZZ(F W 
*&=ZsS%A$SkG
*
 ! (A!!S)c!fs;7G.G&'( {#c))G (( $$n5 		s*   	E? (E? <-E? *E? E? ?FFc                   L    e Zd ZU eed<   dZeed<    ed      ed               Zy)AnalyzeDomainRequestdomainr  niche_hintsc                 T    |xs dj                         }t        |      dkD  r|d d }|S )Nr    )r-  r   )clsr8  s     r   cap_niche_hintsz$AnalyzeDomainRequest.cap_niche_hints  s/     W"OOq6D=%4Ar   N)	r   r   r   r   __annotations__r=  r   classmethodrA  r   r   r   r;  r;    s0    KK]#  $r   r;  c                       e Zd ZU eed<   eed<   dZeed<   dZeed<   dZeed<   d	Ze	e
   ed
<   d	Ze	e
   ed<   d	Ze	e   ed<   y	)BuildPackageRequestr<  
niche_nameherotemplate_typesingle-scrolllayout_stylebalanceddensityNdiscovery_answers	blueprintprofile_slug)r   r   r   r   rB  rH  rJ  rL  rM  r   dictrN  rO  r   r   r   rE  rE    sU    KOM3'L#'GS(,x~, $Ix~$"&L(3-&r   rE  initzPreparing analysisz(Setting up domain parsing and AI context   )r   labelr   est_secondskeywordszDecomposing domainz6Extracting keywords, acronyms, cross-language meaningsr!  ai_analysiszAI niche discoveryzCGPT is analyzing business models, affiliates, and revenue potential   scoringzScoring & rankingz6Sorting niches by viability score and market potentialcompleteAnalysis completez All niches discovered and scoredzPreparing buildz&Loading domain analysis and niche databrandzCreating brand identityz:GPT is designing brand names, taglines, and color palettes   copyzWriting website copyz=Generating headlines, features, testimonials, and FAQ content   saleszWriting sales letterz<Crafting a marketplace-ready sales letter for domain listingimagezGenerating hero imagez-DALL-E is creating a custom hero banner imagesavingzSaving packagezWriting all assets to databasezPackage completezYour business-in-a-box is ready	PreparingzSetting up brand kit processingr   extractzExtracting textzParsing uploaded documents   classify_docszClassifying contentz5AI is analyzing and categorizing your brand documentsclassify_imageszClassifying imagesz0AI is analyzing and tagging your uploaded imagesintelligencezBuilding intelligencezGGenerating brand summary, gap analysis, and image placement suggestions
   zBrand kit readyz7All content classified and ready for package generationzLoading niche data
ai_suggestzAI suggesting widgetsz;Analyzing niche to recommend high-value interactive widgetszSuggestions readyzWidget suggestions generatedzLoading brand and niche dataai_generatezGenerating widgetz1AI is building a complete interactive HTML widget-   zSaving augmentzWriting widget to databasezWidget readyz+Your interactive widget is ready to previewjob_idjob_typer<  total_stepssteps_detailretry_paramsretry_ofc                    t               }	 t        j                  j                         }t        | ||dddd|d||||||      }	|j	                  |	       |j                          t        j                  d|  d| d|        |j                          y # t        $ r5}
|j                          t        j                  d	|  d|
        Y d }
~
Jd }
~
ww xY w# |j                          w xY w)
Npending	Queued...rQ  r   )rl  rm  r<  statuscurrent_stepcurrent_step_keysteps_completedrn  progress_pctro  rp  rq  
started_at
created_at
updated_atzCreated job :  for zFailed to create job )r   datetimeutcnowr"   r   r   r   r   r   r   r   r   )rl  rm  r<  rn  ro  rp  rq  r   nowjobr   s              r   
create_jobr  I  s    	B&&($##%%
" 	s
		l6("XJeF8DE
 	
	  <
,VHBqc:;;< 	
s*   A7B 	C+CC CC C'c                    t               }	 |j                  t              j                  t        j                  | k(        j                         }|s+t        j                  d|  d       	 |j                          y |j                  d      }|r2||j                  k7  r#t        j                  j                         |_        d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_
        d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_        d	|v r
|d	   |_        d
|v r
|d
   |_        d|v r
|d   |_        d|vr:|j"                  xs d}t-        dt/        |j                   |z  dz              |_        |j                  d      dk(  r+t        j                  j                         |_        d|_        n7|j                  d      dk(  r#t        j                  j                         |_        t        j                  j                         |_        |j5                          |j                          y # t6        $ r5}|j9                          t        j                  d|  d|        Y d }~Jd }~ww xY w# |j                          w xY w)Nzupdate_job: job z not found in DBrw  ru  rv  rx  rn  resultr   ro  ry  r   r,  	completedfailedzFailed to update job r}  )r   r   r"   r   rl  r   r   r  r   r   rw  r  r  step_started_atru  rv  rx  rn  r  r   ro  ry  minroundcompleted_atr|  r   r   r   )rl  kwargsr   r  new_step_keytotalr   s          r   
update_jobr  h  sT   	B-hhsm""3::#78>>@NN-fX5EFGR 	
O zz"45LC,@,@@"*"3"3":":"<Cv)CJV#%n5C'#)*<#=C &"():";CF"$]3COv)CJfwCIV#%n5CV#%n5C'OO(qE"3s/B/BU/Jc.Q(RSC::h;.'00779C"CZZ!X-'00779C!**113
		
 	
	  >
.vhb<==> 	
s1   AH7 <F*H7 7	I5 +I0+I8 0I55I8 8J
c                    t               }	 |j                  t              j                  t        j                  | k(        j                         }|r |j                         |j                          S 	 |j                          y # t        $ r5}t        j                  d|  d|        Y d }~|j                          y d }~ww xY w# |j                          w xY w)NzFailed to get job r}  )r   r   r"   r   rl  r   to_dictr   r   r   r  )rl  r   r  r   s       r   get_job_dictr    s    	B	hhsm""3::#78>>@;;= 	
 
 	
	  +F82aS9:

	 	
s*   AB 	CB<'C <CC Cc            
      0   	 t               } | j                  t              j                  t        j                  j                  ddg            j                         }|D ]-  }|j                  dk(  r|j                  rw|j                  xs i }|j                  dg       }|D ]  }|j                  d      dk(  sd|d<    d|d<   ||_        dt        d	 |D               d
t        |       d|_        nd|_        d|_        d|_        t        j                  j                         |_        t        j                  j                         |_        t$        j'                  d|j(                   d|j                   d|j*                   d       0 |r2| j-                          t$        j'                  dt        |       d        j3                          y # t.        $ r"}t$        j1                  d|        Y d }~7d }~ww xY w#  j3                          w xY w)Nrs  runningbatch_analyzer   ru  interruptedmodeu   Interrupted — c              3   2   K   | ]  }|d    dk(  sd  ywru  r  r   Nr   .0ds     r   	<genexpr>z(recover_orphaned_jobs.<locals>.<genexpr>  s     9kPQRZP[_jPj!9k   /z completed. Resume available.zInterrupted by server restartr  u6   Server restarted — job interrupted before completionzRecovered orphaned job:  (r~  )z
Recovered z orphaned job(s)z!Failed to recover orphaned jobs: )r   r   r"   r   ru  in_allrm  r  r   sumr   rv  r   r  r  r  r|  r   r   rl  r<  r   r   r  r   )r   orphansr  r  r   dsr   s          r   r   r     s   ^((3-&&szz~~y)6L'MNRRT 	cC||.3::)r **Y3! 5Bvvh'94'485 "/v#
%5c9kW9k6k5llmnqrynzm{  |Y  $Z #B !CJPCI'00779C%..557CNKK23::,beTWT^T^S__`ab!	c" IIKKK*S\N2BCD 	
  @:1#>??@ 	
s1   B7G :D
G 	H G;6H ;H  H Hc                     	 t               } t        j                  j                         t        j                  t              z
  }| j                  t              j                  t        j                  j                  ddg      t        j                  |k        j                         }t        |      }|D ]  }| j                  |        |dkD  r0| j                          t        j!                  d| dt         d        j'                          y # t"        $ r"}t        j%                  d|        Y d }~7d }~ww xY w#  j'                          w xY w)	Ndaysr  r  r   zCleaned up z jobs older than z dayszFailed to cleanup old jobs: )r   r  r  	timedeltaJOB_RETENTION_DAYSr   r"   r   ru  r  r{  r  r   deleter   r   r   r   r  r   )r   cutoffold_jobsr   r  r   s         r   r   r     s   ^""))+h.@.@FX.YY88C=''JJNNK23NNV#
 #% 	 H 	CIIcN	19IIKKK+eW,=>P=QQVWX 	
  ;5aS9::; 	
s*   C>D 	D<D72D? 7D<<D? ?Er  domain_namer=  c                     t               }	 t         dddt        t              dz
  d        fd}t	        |||      }|j                  t              j                  t        j                  |k(        j                         }|r+||_
        t        j                  j                         |_        n;t        ||t        j                  j                         	      }|j                  |       |j                          |j!                  |       t         d
dt        t              dz
  t        t              dz
  d|j"                  ||d       |j-                          y # t$        $ rI}t&        j)                  d| d|        t         ddt+        |       t+        |             Y d }~^d }~ww xY w# |j-                          w xY w)Nr  zPreparing analysis...r   r   rQ  ru  rv  rx  rn  rw  c                     |t        t              k  r&t        t        |t        t              dz
           d   nd}t        | |t        t              dz
  |       y Nr   r   rY  )rv  rx  rn  rw  )r   ANALYSIS_STEPSr  r  	step_textr  r  step_keyrl  s       r   progress_cbz%run_analysis_job.<locals>.progress_cb  sV    W`cfgucvWv~c)S5H5J&KLUS  }GHvIy#&~#6#:XWr   )progress_callbackr=  )r<  analysisanalyzed_atr  zAnalysis complete!rY  )idr<  r  ru  rv  rx  rn  rw  r  zAnalysis job failed for r}  r  Error: ru  rv  r   )r   r  r   r  r;   r   r   r   r<  r   r  r  r  r  r   r   refreshr  r   r   r   r   r   )rl  r  r=  r   r  r  r   r   s   `       r   run_analysis_jobr    sw   	B6):Q#$#n2E2I$*	,	W
 "+Zef88F#**6==K+GHNNP (H#+#4#4#;#;#=H [8QYQbQbQiQiQklHFF8
		


86+<P#&~#6#:NH[^_H_$.!)QYZ	\ 	
	  [/}BqcBC6(73q6(9KSVWXSYZZ[ 	
s*   E E 	F0'?F+&F3 +F00F3 3Gr   r   c                 \
    t         j                         }|st               }|t          <   t        j                  j	                         j                         g g |D ]  }j                  |d dd d d d        t        |      ddd- fd	} |dd d       d}i }	 |k  s|r|j                  j                         r1D ]  }|d   dk(  sd	|d<     |d
dz    d d       |D ]  }	 n}|j                  j                         s< |ddz    d dt        |       d       |j                  j                  d       t        |      t        k  r:|k  r4|j                  j                         rn|j                  j                         sn|   }|d   j                         j                         }
|
sd|d<   |dz  }d d d  dt        t!        j"                               d d  }||d<   d|d<   t        j                  j	                         j                         |d<   t%        |d|
t        t&              dz
  t&        |
 d       t(        j+                  t,        ||
      }|||<   |dz  }t        |      t        k  r|k  r4 |d       |rt.        j0                  j                  |j3                         dt.        j0                  j4                         \  }}|D ]l  }	|j7                  |	      }|   }t        j                  j	                         j                         |d!<   |j                  d      rxt        j                  j9                  |d         }t        j                  j9                  |d!         }t;        ||z
  j=                         d      |d"<   j                  |d"          t?               }	 |jA                  tB              jE                  tB        jF                  |d   k(        jI                         }|r+|jJ                  |d<   |jL                  r|jL                  |d#<   nd$|d<   |jQ                           |d       o n|k\  rn|k  r|r|j                  j                         s |d$d% d& d' d(       d,|_*        y # tN        $ r d$|d<   Y rw xY w# |jQ                          w xY w# tN        $ r7}tR        jM                  d)|         |d*d+t        |              Y d }~ld }~ww xY w# d,|_*        w xY w).Nqueued)r<  rl  ru  r   rz  r  r   c                    t        d D              t        d D              t        d D              }t        d D              }z   }t        |t        d      z  dz        }	 D cg c]  }|d   dk(  s|j                  d	      s|! }}|rt	               }	 |D cg c]  }|d	   	 }	}|j                  t              j                  t        j                  j                  |	            j                         }
|
D ci c]&  }|j                  s|j                  |j                  ( }}|D ]  }|j                  |d	         }|s||d
<     	 |j                          t        j                  j                         }t        j                  j!                        }t        ||z
  j#                         d      }r!t        t              t%              z  d      nd}|z
  }|dkD  rt        ||z  d      nd}t'        | dk(  rdn| |xs | d d| d| d| dk7  r|nd| ||t(        |||d       y c c}w c c}w c c}w # |j                          w xY w# t        $ r Y w xY w)Nc              3   2   K   | ]  }|d    dk(  sd  ywr  r   r  r  s     r   r  zLrun_batch_analysis_orchestrator.<locals>.save_batch_state.<locals>.<genexpr>  s     WB2h<;;VaWr  c              3   2   K   | ]  }|d    dk(  sd  yw)ru  r  r   Nr   r  s     r   r  zLrun_batch_analysis_orchestrator.<locals>.save_batch_state.<locals>.<genexpr>  s     Q88P1Qr  c              3   2   K   | ]  }|d    dk(  sd  yw)ru  r  r   Nr   r  s     r   r  zLrun_batch_analysis_orchestrator.<locals>.save_batch_state.<locals>.<genexpr>  s     ObR\Y5NOr  c              3   2   K   | ]  }|d    dk(  sd  ywru  r  r   Nr   r  s     r   r  zLrun_batch_analysis_orchestrator.<locals>.save_batch_state.<locals>.<genexpr>  s     K2"X,(2JQKr  r   r,  ru  r  rl  rv  r   r  z domains processed (z	 active, z queued)r  )r  r   r  r  r  	in_flightr  r=  concurrencybatch_started_atelapsed_secondsavg_seconds_per_domainest_remaining_secondsru  rv  ry  r  )r  r  maxr   r   r   r"   r   rl  r  r  rv  r   r   r  r  fromisoformattotal_secondsr   r  BATCH_CONCURRENCY)r  step_msgr  r  
done_totalpctr  
running_dsstep_dbjob_ids
child_jobsjstep_mapcsr  batch_start_dtelapsedavg_timeremaining_countest_remainingr   batch_start_timecompleted_countdomain_statusdomain_timesfailed_countr=  r  s                       r   save_batch_statez9run_batch_analysis_orchestrator.<locals>.save_batch_state  s~   W-WWQ}QQOMOO	KKK$|3
Z#eQ-/367	'4g8	8QVXV\V\]eVf"gJg&.	$6@Ar(|AGA!(s!3!:!:3::>>';R!S!W!W!YJBL_QPQP^P^!.. 8_H_( 4%\\"X,713B~.4
 MMO &&(!**889IJ~-<<>BFR5\*S->>BXY*,@H1h8!<RS8'+y'8)d ( {zl!E7BVW`Vaajkqjrrz,{'+{':#"/ %$3!-$-!'&1&7+;*1190=		/ h B_ MMO 		ss   +I' /I=III' "I &I2AI II2I I I' I' 
I I$$I' '	I43I4r  zStarting batch analysis of z domains...ru  	cancelledstoppedzBatch stopped. r  z processed.pausedzBatch paused. z processed, z in flight.rR  )timeoutr<  skippedr   zba-r   -r   rl  rz  analyze)r<  r=  r   rp  )r  return_whenr  r  r   r  zBatch complete! z succeeded, z failed out of .z$Batch analysis orchestrator failed: r  zOrchestrator error: FN)+batch_controlr   r   r  r  	isoformatappendr   r   is_setr   r   r  r-  lowerr   uuiduuid4r  r  batch_executorsubmitr  
concurrentfutureskeysFIRST_COMPLETEDpopr  r  r  r   r   r"   r   rl  r   ru  r   r   r   r   r   )r   r   r=  stater  r  idxr   r  fr  child_job_idfuturedone_futures_f_idx
started_dtcompleted_dtchild_db	child_jobr   r  r  r  r  r  r  s   ` `                  @@@@@@r   run_batch_analysis_orchestratorr    sM   h'E8$"'h((//1;;=LM ITXX\lp  CG  H  	II LEOL3 3j Y"=eWK PQ
CGNEkW%%'' 3B(|x/'283 !ooP\>\=]]^_d^eep,qr  A$$++- ^Ol<Z;[[\]b\ccopst{p|o}  ~I  ,J  K!!&&q&1g,!22sU{??))+((//1"3' l00288:"#,BxL1HC!$Xbq\N!C

4Ebq4I3JK+8(8#+#4#4#;#;#=#G#G#I< <K^ATWXAXZh3>{hp(qs (../?{\gh"%q/ g,!22sU{2 Y'","4"4"9"9',,.RSakasas  bD  bD"9  #Ea% 0A#KKNE&u-B)1):):)A)A)C)M)M)OB~&vvl+%-%6%6%D%DREU%V
'/'8'8'F'Fr.GY'Z05|j7P6_6_6acd0e,-$++B/@,AB+~H)$,NN3$7$>$>szzRPX\?Y$Z$`$`$b	$+4+;+;BxL(.7oo7+6BxL !($Y/-0. I EkWL %%'[,<_<M\ZfYggvw|v}}~*  A  % 3'283 !(  D;A3?@%9#a&#BCCD su   1/S !GS 'D4S A8R6'S =S -S 6SS
SS

SS 	T(-TT" TT" "	T+rF  rH  rM  rJ  rL  rN  rO  c	                 Z    ddl m}	m}
m} t	               }	 t         dddt        t              dz
  d       	  |
||||||d|        |	|d	d
| d| d| d| |       |j                  t              j                  t        j                  |k(        j                         }|r|j                   s!t         ddd       	 |j#                          y d }|j                   j%                  dg       D ]7  }|j%                  dd      j'                         |j'                         k(  s5|} n |r	  |
|d|i|       d}|j                  t(              j                  t(        j                  |k(  t(        j*                  dk(        j                         }|rP|j,                  xs g }t/        |j0                  xs i ||      }t        j3                  d| dt        |       d       d}	  |||      }|r$t        j3                  dt        |       d|         fd}t5        |||||||||	      }|j7                  d d       }d }|ra|j9                  d!d"       d#}t:        j<                  j?                  d$d%|      }tA        |d&      5 }|jC                  |       d d d        d'| }|r|d(k(  nd)}d }d }|rd(nd*}|ro|j%                  d+i       } i }!| j%                  d,g       }"| j%                  d-d      }#|"ry|#t        |"      k  rk|"|#   }$|$j%                  d.| j%                  d.d/            |$j%                  d0| j%                  d0d1            |$j%                  d2| j%                  d2d3            d4}!	 t         d5d6d78       dd9l"m#}%  |%|||!      }t        j3                  d:t        |j%                  d;g              d<|        	 t         d?d@dA8       ddBl$m%}'  fdC}( |'|||(D      }|r"|j%                  dEi       j%                  dFd      nd})t        j3                  dG| d|) dH       t         dJ|rdKnd6dL8       |j                  tL              j                  tL        jN                  |k(  tL        jP                  |k(        j                         }+|+r|j%                  d+i       |+_)        |j%                  dMi       |+_*        |j%                  dNd      |+_+        ||+_,        ||+_-        ||+_.        ||+_/        ||+_0        ||+_1        ||+_2        ||+_3        th        jh                  jk                         |+_6        |jo                          |jq                  |+       |+jr                  },ntM        |jr                  |||j%                  d+i       |j%                  dMi       |j%                  dNd      ||||||||O      }-|ju                  |-       |jo                          |jq                  |-       |-jr                  },	 |j                  t(              j                  t(        j                  |k(  t(        j*                  dk(        j                         }|r|j%                  dMi       }.tw        |.jy                               }/|j                  tz              j                  tz        j|                  |jr                  k(        j                         }0|0D ]G  }1|1j                  dPk(  rL|1j                  r@t        j$                  |1j                  g       }2|2D 3cg c]	  }3|3|/v s|3 }4}3|4r|4nd |1_C        _|1j                  dQk(  sodRdSgdSgdTdUgdVgdWdXgdSdRgdYgdZgdXgdWd[gd\
}5g }4|j0                  xs i }6|5j                         D ]{  \  }7}8|6j%                  |7      }9|9st        |9t              rt        |9      d6kD  s t        |9t              sIt        |9      dkD  sX|4j                  |8D 3cg c]	  }3|3|/v s|3 c}3       } |4rt        tw        |4            nd |1_C        J |jo                          t        j3                  d]| d^       	  |	|d`da| db|, dc|       t         dddet        t              dz
  t        t              dz
  df|,||dgh       |j#                          y # t        $ r#}t        j                  d|        Y d }~Zd }~ww xY w# t        $ r Y w xY w# t        $ r#}t        j                  d|        Y d }~d }~ww xY w# 1 sw Y   lxY w# t        $ r(}&t        j                  d=| d>|&        d }Y d }&~&yd }&~&ww xY w# t        $ r(}*t        j                  dI| d>|*        d }Y d }*~*Ed }*~*ww xY wc c}3w c c}3w # t        $ r&}:t        j                  d_| d|:        Y d }:~:qd }:~:ww xY w# t        $ r Y rw xY w# t        $ rJ}:t        j                  di| d|:        t         ddjt        |:       t        |:             Y d }:~:d }:~:ww xY w# |j#                          w xY w)kNr   )log_context_eventupdate_project_stateget_full_context_for_domainr  zStarting package generation...r   rQ  r  )selected_nicherH  depthrM  rO  build_startedzBuilding package for niche 'z	', depth=z, template=z
, profile=z(Context engine hook failed (non-fatal): r  z Domain not found or not analyzedDomain not foundr  nichesr   r  
niche_datareadyzBrand kit loaded for r}  z chars of contextzContext engine assembled z chars for z%Context assembly failed (non-fatal): c                     |t        t              k  r&t        t        |t        t              dz
           d   nd}t        | |t        t              dz
  |       y r  )r   BUILD_STEPSr  r  r  s       r   r  z"run_build_job.<locals>.progress_cb  sR    QZ]`al]mQm{3y#k2B12D#EFuMs}HvIy#&{#3a#7(Tr   )r  discovery_contextrH  rN  brandkit_contextassembled_contexthero_image_datar  r
  z	_hero.pngr   imageswb/static/images/	legendaryFstandardr[  optionsrecommendedcolor_primary#6366f1color_secondary#8b5cf6color_accent#f59e0bprimary	secondaryaccentz%Generating interactive calculators...rd  calculatorsrv  rx  rw  generate_all_calculatorsz
Generated specsz calculators for z!Calculator generation failed for z (non-fatal): z#Building niche reference library...r   	referencegenerate_full_reference_libraryc                 &    t        d|         y )NzReference library: rv  )r  )msgstepr  rl  s      r   ref_progressz#run_build_job.<locals>.ref_progress  s    v6I#4OPr   )r  metadatatotal_entriesz Generated reference library for z entriesz(Reference library generation failed for zSaving package to database...   ra  	site_copyr(  )	domain_idr  chosen_nicher[  rC  r(  hero_image_urlrH  rJ  rL  rM  r3  reference_libraryluxury_tierr`  documentrG  abouttestimonialssocial_proofteamfeaturespricingfaqstats
comparison)
mission_statementabout_contentrK  	team_infoproduct_servicescore_valuesfaq_content
statisticspricing_infocompetitive_advantageszUsed-in-sections mapped for z brand kit assetsz$Used-in-sections mapping failed for build_completedz Package built successfully for 'z
' (pkg_id=r  r  zPackage complete!rY  )r  r<  nicher  zBuild job failed for r  )Japp.services.context_enginer  r  r  r   r  r   r  r   r   r  r   r   r   r<  r   r  r   r   r  r&   ru  image_classificationsra   	extractedr   r<   r  replacer   r   joinopenwrite!app.services.calculator_generatorr6  app.services.reference_libraryr:  r    r  rE  r[  rC  r(  rF  rH  rJ  rL  rM  r3  rG  rH  r  r  r{  r   r  r  r   r   r  r'   brand_kit_idr  
asset_typeclassificationri   used_in_sectionsitemsr1  r   listextendr   );rl  r  rF  rH  rM  rJ  rL  rN  rO  r  r  r  r   ctx_errdomain_recordr  r]  
bk_contextkit	img_classr   r  packager!  rF  img_filenameimg_pathr  is_legendarycalculators_datareference_datarH  
brand_infobrand_colorsoptsrecselectedr6  calc_errr:  r?  entry_countref_errexisting_pkgpkg_idnew_pkgrC  site_section_keys
kit_assetsassetmappedsused
doc_fieldsr`  	field_keysectionsvalr   s;   `                                                          r   run_build_jobr    s
   pp	B@6):Z#$#k2BQ2F$*	,
	Q ",!. %6 ,/  k?>Z[eZffopwox  yD  ER  DS  S]  ^j  ]k  =l  np  q (//0LMSSUM$:$:vh=_gyzX 	
U 
"++//"= 	Eyy$**,
0@0@0BB"
	
 $[<2LbQ 
hhx '';(F[bHbciik117RI/0CYP[\JKK/}Bs:>OO`ab	N ;K L 7<M8N7O{[fZghi	T
  Z)/''/
 "++&7>)11#s;<IFLww||HhEHh% )().|n=N3:;.%1kz Wb1JL>>)R0D..2Cc$i9'||OZ^^O]f=gh!).?PaclAm!n&ll>:>>.Zc;de (60W+,}NV#;J
T`#a j-=-A-A'2-N)O(PPabmanop
&60U+,{LZQ!@Zkw!x\jn00R@DD_VWXpq>{m2k]Zbcd
 	6(G(41!h	X xx(//;.0D0D
0R

%' 	 !(Wb!9L%,[[b%AL"(/NB(GL%*8L')6L&(4L%#*L ->L*'7L$-;L*'2L$&.&7&7&>&>&@L#IIKJJ|$!__F'**R\kk'2.'++kSU:V$[[<^+,PW"3,"0'	G FF7OIIKJJwZZF	T((8$++HOO{,JHOO_fLfgmmoC#KKR8	$'	(8$9!XXm4;;M<V<VZ]Z`Z`<`aeeg
' SE''72u7K7K!;!?!?@T@TVX!Y+1LaQ:K5KLL9=4.))Z7<BG;L`g_h  |J  LZ  {[  kq  jr  IS  U^  H_  qx  z@  pA  SX  RY  jq  ir  EN  DO  lv  xD  kE  &F
!$'MM$7R	3=3C3C3E ]/Ix"+--	":C"C)=#c(Q,T^_bdhTinqrunvyznz $,[1AIZDZQ,[ \] EIc$id.S 		:;-GXYZ	k+<@`ak`llvw}v~~  ?A  CE  F 	6+<O#&{#3a#7SEUXYEY$.!';T	V 	
e  	QNNEgYOPP	Q"    	NNNB7)LMM	N.) )8  (!B;-~^f]ghi#' (  &!I+Vdeldmno!%&h  M -\  	TLL?}BqcRSS	T
  		  [,[MA3?@6(73q6(9KSVWXSYZZ[ 	
s  !g 'b  A g Ag %g -c 9B+g %/c A1g dCg .Ad A'e )G	g 3Df  	e6e6f  4Af  .f  ;f  
f  	e;#e;'Af  :f2 6g 	b?b:4g :b??g 	cg cg 	c>c93g 9c>>g dg 	d?d:4g :d??g 	e3e.(g .e33g 6
f   	f/	f*$g *f//g 2	f?;g >f??g 	h?h
h hh h*c           	      Z   t               }	 t        | dddd       |j                  t              j	                  t        j
                  |k(        j                  t        j                  j                               j                         }|s!t        | ddd       	 |j                          y |j                  t              j	                  t        j                  |j                  k(        j                         }d }|rl|j                  r`|j                  j                  d	g       D ]A  }|j                  d
d      j!                         |j"                  j!                         k(  s?|} n t        | ddd       t%        |j"                  |      }t        | ddt'        t(              dz
  dd|i       |j                          y # t*        $ rI}t,        j/                  d| d|        t        | ddt1        |       t1        |             Y d }~^d }~ww xY w# |j                          w xY w)Nr  zLoading niche data...r   rQ  ru  rv  rx  rw  r  Package not foundr  r  r   r  z,AI analyzing niche for widget suggestions...r   ri  r4  r  zSuggestions ready!rY  suggestionsru  rv  rx  rw  r  zAugment suggest job failed for r}  r  )r   r  r   r    r   r  order_byr{  descr   r   r   r  rD  r  r   r  rE  rT   r   AUGMENT_SUGGEST_STEPSr   r   r   r   )	rl  r  r   rs  ro  r  r]  r  r   s	            r   run_augment_suggest_jobr  `  s   	B6):Q#$v	? ((7#**7+>+>++MNWWX_XjXjXoXoXqrxxzvh=PXkl0 	
- (//		W=N=N0NOUUW
]33&//33HbA 99VR(..0G4H4H4N4N4PP!&J
 	6(V#$|	E 'w';';ZH6+<P#&'<#=#A$.(+6	8 	
	  [6{m2aSIJ6(73q6(9KSVWXSYZZ[ 	
s8   BG -B7G %AG 	H?HH HH H*augment_typer   custom_instructionssuggestion_metac                 ,   t               }	 t        | dddd       |j                  t              j	                  t        j
                  |k(        j                  t        j                  j                               j                         }|s!t        | ddd       	 |j                          y |j                  t              j	                  t        j                  |j                  k(        j                         }d }	|rl|j                  r`|j                  j                  d	g       D ]A  }
|
j                  d
d      j!                         |j"                  j!                         k(  s?|
}	 n |s;t%               j                  |i       }|j"                   d|j                  dd       }t        | d| ddd       t'        |||j"                  |j(                  |	|      }t        | ddd       |d   xs i }|rT|j                  dd      |d<   |j                  dd      |d<   |j                  dd      |d<   |j                  dd      |d<   t+        |j                  |||d   |d    ||d!   "      }|j-                  |       t/        |j                  d#|d$d%| ||d&'      }|j-                  |       |j1                          |j3                  |       t        | d(d)t5        t6              dz
  d*|j                  ||j8                  |j:                  |d+,       |j                          y # t<        $ rI}t>        jA                  d-| d.|        t        | dd/tC        |       tC        |             Y d }~^d }~ww xY w# |j                          w xY w)0Nr  zLoading brand and niche data...r   rQ  r  r  r  r  r  r   r  r  rS  WidgetzAI generating ...r   rj  r4  )r  r   r]  
brand_datar  r  zSaving augment to database...rR  ra  r   target_audiencebenefit_levelr!  benefit_reasoncategory
engagementr   r   html_content)
package_idr  r  r   r   r   r  augmentgeneratezGenerated augment: r
  r   r  revision_typesection_keyactionr   
after_datar  zWidget ready!rY  )r  r
  r   r   r<  r  z Augment generate job failed for r}  r  )"r   r  r   r    r   r  r  r{  r  r   r   r   r  rD  r  r   r  rE  rS   rU   r[  r$   r   r!   r   r  r   AUGMENT_GENERATE_STEPSr   r   r   r   r   r   )rl  r  r  r   r  r  r   rs  ro  r  r]  	type_infor  
aug_configr  revr   s                    r   run_augment_generate_jobr    se   	BI6):[#$v	? ((7#**7+>+>++MNWWX_XjXjXoXoXqrxxzvh=PXklD 	
A (//		W=N=N0NOUUW
]33&//33HbA 99VR(..0G4H4H4N4N4PP!&J
 )+//bAI++,AimmGX.N-OPE6.s(C#$}	F '%&&}}! 3
 	6(G#$x	A H%+
,;,?,?@QSU,VJ()*9*=*=oq*QJ'+:+>+>?OQS+TJ'(%4%8%8\%RJz"zz#%/}-/
 	wzz-@+H ,u=

 	s
		


76+O#&'=#>#B$.!(\GMM*1*=*=V	W 	
	  [7}BqcJK6(73q6(9KSVWXSYZZ[ 	
s8   BL, -B7L, %F6L, ,	M>5?M94N 9M>>N Nmin_augmentsmax_augmentsc                    t               }	 |j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|s| ddd|j                          S |j                  t              j                  t        j                  |j                  k(        j                         }||k\  r| dd|d|j                          S t        ||z
  ||z
        }|dk  r| dd|d|j                          S |j                  t              j                  t        j                  |j                   k(        j                         }d}|rl|j"                  r`|j"                  j%                  d	g       D ]A  }	|	j%                  d
d      j'                         |j(                  j'                         k(  s?|	} n t+        |j(                  |      }
|j                  t              j                  t        j                  |j                  k(        j-                         D ch c]  }|j.                   }}|
D cg c]  }|j%                  d      |vs| }
}t1        |
d d      d| }
g }|
D ]  }t3        t5        j6                               dd }t9        |d| t;        t<              dz
  t<               t>        jA                  tB        || |j%                  dd      |j%                  dd      d|       |jE                  |        | d||t;        |      d|j                          S c c}w c c}w # tF        $ rD}tH        jK                  d|  d|        | dt3        |      dcY d}~|j                          S d}~ww xY w# |j                          w xY w)zSuggest + generate augments for a domain to bring it up to min_augments (hard cap: max_augments).
    Idempotent: re-counts inside a fresh session before generating to avoid race-condition overdraft.r  
no_package)r<  ru  reasonmaxed)r<  ru  r  r   r   
sufficientNr  r   r  r
  c                 &    | j                  dd      S )Nr  r   r   xs    r   <lambda>z-run_auto_augment_for_domain.<locals>.<lambda>  s    oq8Q r   Tr   reverse   augment_generater   	estimatorr   r  )r<  ru  count_beforejobs
generatingzAuto-augment failed for r}  r   )r<  ru  r   )&r   r   r    r   r  r  r{  r  r   r   r$   r  r  r   r  r   rD  r  r   r  rE  rT   r  r  sortedr   r  r  r  r   r  r   r  r  r  r   r   r   )r  r  r  r   rs  current_countneededro  r  r]  r  aexisting_typesr  jobs_startedjidr   s                    r   run_auto_augment_for_domainr    sQ    
B'((7#**7+>+>++MNWWX_XjXjXoXoXqrxxz)Y,WH 	
E )001C1Cwzz1QRXXZL()Y'\ij@ 	
= \M1<-3OPQ;)Y,ano8 	
5 (//		W=N=N0NOUUW
]33&//33HbA 99VR(..0G4H4H4N4N4PP!&J
 'w';';ZH24((72C2J2J7K]K]ahakakKk2l2p2p2rsQ!..ss"-UQvn1TqUU[.Q[_`ahbhi 	%Adjjl#BQ'Cs.SAW=X[\=\^tu 8#{AEERXZeLfhihmhmnuwyhz|~  AB  C$		% &=bn  B  CO  P  Q
 	
! tU  K/}BqcBC%3q6JJ

	K 	
sp   A5M AM ;M )B7M !A*M MM $M=MC M 
M 	N)%)N$N)N, $N))N, ,N>r   c                     K   d} 	 t               }|j                  t        d             d} |j                          | rdnd| rddS ddS # t        $ r Y w xY ww)	NFzSELECT 1Tokdegraded	connectedunreachable)ru  database)r   r   r   r   r   )db_okr   s     r   healthzr     sn     E^


4
#$

  $Z#(K .;   s'   A6A A	AAAAr   )response_classc                 &  K   t               }	 |j                  t              j                         }|dk(  }|j	                          | j
                  j                  d      }t        j                  d| ||dd      S # |j	                          w xY ww)Nr   r   z
login.htmlr  )r   
setup_moder   r   )	r   r   r+   r   r   query_paramsr   	templatesTemplateResponse)r   r   r   r  r   s        r   
login_pager    s     	BXXh'--/
1_


  $$W-E%%l 	5   	
s   B(A< AB<BBc                   K   | j                          d {   }|j                  dd      j                         }|j                  dd      }t               }	 |j	                  t
              j                         }|dk(  rK|j                  dd      }|r|st        dd      |j                          S ||k7  rt        d	d      |j                          S t        |      d
k  rt        dd      |j                          S t        |d      }|j                  |       |j                  |       t        dd      }|j                  |       |j                          || j                  d<   d| j                  d<   t        j                  j!                         |_        |j                          t        dd      |j                          S |j	                  t
              j%                  t
        j&                  |k(        j)                         }|r|j+                  |      st        dd      |j                          S || j                  d<   |j,                  | j                  d<   t        j                  j!                         |_        |j                          t        dd      |j                          S 7 # |j                          w xY ww)Nr   r  passwordr   password_confirmz+/login?error=Username+and+password+requiredr   r   z#/login?error=Passwords+do+not+matchr   z3/login?error=Password+must+be+at+least+4+charactersTr   is_adminr   r   r   r   r  r  z)/login?error=Invalid+username+or+password)formr   r-  r   r   r+   r   r   r   r   set_passwordr   r,   r   r   r  r  
last_loginr   r   r   check_passwordr  )	r   r  r   r  r   r   r  userr   s	            r   login_submitr  !  s0    Dxx
B'--/Hxx
B'H	B XXh'--/
?#xx(:B?8',Ygjk6 	
5 ++',Q_bc2 	
1 8}q ',aors. 	
- X=Dh'FF4L!oVDGFF7OIIK*2GOOJ'*.GOOJ'&//668DOIIK#= 	
 xx!(():):h)FGMMO4..x8#(Sade 	
 '/
#&*mm
#"++224
		CS9

K  J 	
sh   KJ7A KAJ: #K4J: KJ: 0KB:J: ;KA"J: .K?A'J: &K:KKN5G4K8fWLY9MrapEkZnw_gz'/_dev_preview/{token}/static-storefronttokenr   c                 n   K   | t         k7  rt        d      ddlm}  ||dd      }t	        |      S w)N  r   r   generate_static_storefrontr  base_urlcontact_emailr  )_DEV_PREVIEW_TOKENr   !app.services.storefront_generatorr  r	   )r  r   r  htmls       r   #dev_preview_static_storefront_earlyr  N  s6     "",,L%b2RHD%%s   35z$/_dev_preview/{token}/{domain}/adminc                   K   |t         k7  rt        dd      |j                  t              j	                  t        j
                  |k(        j                  t        j                  j                               j                         }|st        dd      |j                  xs i }|j                  dd      }|j                  dg       }|r|t        |      k  r||   n|d	d
}|j                  t              j	                  t        j
                  |k(        j                  t        j                        j                         }	g }
|j                  t              j	                  t        j                   |k(        j                         }|rM|j                  t"              j	                  t"        j$                  |j&                  k(        j                         }
ddlm}  ||j,                  xs i       }|j.                  xs i j                  di       }t1        |t2              si }ddd}|j4                  rd|d<   |	D ])  }d|dt7        |j&                  |j8                         d<   + |j;                         D ]A  \  }}|j                  dd      j=                         j?                  dd      }d|d| d| d<   C |j@                  r/d|dtB        jD                  jG                  |j@                         <   |D ]I  }|j                  dtB        jD                  jG                  |j                  dd	                  }d|d| <   K |
D ]'  }|jH                  xs d}d|d| d|jJ                   <   ) tM        |dd       xs d}dd l'm(} 	  |||||jR                  xs i ||	|
||||!      }tY        |      S # tT        $ r/ tW        ||||jR                  xs i ||	|
|||
      }Y tY        |      S w xY ww)"Nr  Invalid preview tokenr   detail   No package found for this domainr(  r   r'  r  r   taglineflatten_pack_assets	documentsr   )
index.html
admin.html
sales.htmltools/.htmltiergeneralr  r  docs/r  images/filenamer   images/graphics/uncategorizedassets/brand-kit/
style_tierpremium)render_standalone_admin)r  )-r  r   r   r    r   r  r  r{  r  r   r[  r   r   r$   r  r&   r<  r'   rg  r  app.services.graphicsr  graphics_packbusiness_boxr1  rP  r(  _augment_slugr   rk  r  ra  rF  r   r   basenameri  r  getattr app.services.standalone_rendererr  rC  r   generate_standalone_admin_htmlr	   )r   r  r<  r   rs  r[  recommended_idxr'  chosen_brandaugmentsbrand_kit_assetsrq  r  graphics_assetsbusiness_docsmanifestaugdkdv	tier_sluggafnbkar@  r  r  
admin_htmls                              r   dev_preview_adminr*  W  s    ""4KLLhhw&&w':':f'DENNwOaOaOfOfOhiooqG4VWWMMREiiq1Oii	2&G/6?SQX\;Y7?+hn{}_~Lxx ''(;(;v(EFOOPWPbPbcggiH
((8

#
#HOOv$=
>
D
D
FC
88M299-:T:TX[X^X^:^_cce9)'*?*?*E2FO))/R44["EMmT*q1H!" GEF6-		:;5ABG%%' 4BVVFI.557??SI	2351RD./4 IJ7277++G,B,BCDEF .VVJ 0 0r1B CD,-#B4().   ?  3O=>$SE3<<.9:? ,5BJH

,L%):):)@b'&

 
##  
3L%):):)@b'&

 
##
s*   NO2!N7 ,O27+O/"O2.O//O2z)/_dev_preview/{token}/{domain}/standalonec                 d  K   |t         k7  rt        dd      |j                  t              j	                  t        j
                  |k(        j                  t        j                  j                               j                         }|st        dd      |j                  xs i }|j                  dd      }|j                  dg       }|r|t        |      k  r||   n|d	d
}|j                  t              j	                  t        j
                  |k(        j                  t        j                        j                         }	t        |dd       xs d}
|j                   }	 |j                  t"              j	                  t"        j$                  |k(        j                         }|r|j                  t&              j	                  t&        j(                  |j*                  k(  t&        j,                  j/                  g d            j                         }|rA|d   j0                  }|r0t2        j4                  j7                  |j9                  d            r|}ddlm} |j@                  xs i } |||||jB                  xs i ||	|
||jD                  	      }tG        |      S # t:        $ r Y Uw xY ww)Nr  r  r  r  No package foundr(  r   r'  r  r  r  r  hero_banner	lifestylebackground_texturer  )render_standalone_site)r  r  designationsrH  )$r  r   r   r    r   r  r  r{  r  r   r[  r   r   r$   r  r  rF  r&   r<  r'   rg  r  ri  r  	file_pathr   r   existslstripr   r  r1  site_designationsrC  rH  r	   )r   r  r<  r   rs  r[  r  r'  r  r  r  rF  rq  hero_assetsbk_pathr1  
site_desigr  s                     r   dev_preview_standaloner:    sP    ""4KLLhhw&&w':':f'DENNwOaOaOfOfOhiooqG4FGGMMREiiq1Oii	2&G/6?SQX\;Y7?+hn{}_~Lxx ''(;(;v(EFOOPWPbPbcggiH,5BJ++Nhhx ''6(ABHHJ((=188**cff4,,001cd ce  %a.22rww~~gnnS.AB%,N H**0bJ!&,w?P?P?VTVXfqy  AK  Zd  t{  tI  tI  JD  s,   EJ0"C5J! A
J0!	J-*J0,J--J0z$/_dev_preview/{token}/{domain}/salesc                    K   |t         k7  rt        dd      d| j                  d<   t        | ||       d {   S 7 w)Nr  r  r  _dev_previewr   )r  r   r   sales_letter_view)r   r  r<  r   s       r   dev_preview_salesr>    s@     ""4KLL"0GOOJ"7FB7777s   6?=?z*/_dev_preview/{token}/{domain}/{scroll_to}z/_dev_preview/{token}/{domain}	scroll_toc                 (	  K   |t         k7  rt        dd      |j                  t              j	                  t        j
                  |k(        j                  t        j                  j                               j                         }|st        dd      ddl
m} ddlm}m} |j                  xs i }	 ||j                   xs i       }
 ||
d	
      \  }
} ||	d	
      \  }	}|	j#                  dd      }|	j#                  dg       }|r|t%        |      k  r||   n|dd}|j                  t&              j	                  t&        j(                  |k(        j                         }i }|rX|j                  t*              j	                  t*        j,                  |j.                  k(        j1                         }t3        |      }|j4                  xs i }ddlm}  ||      }|r|D cg c]\  }|j#                  d      |j#                  dd      |j#                  dd      |j#                  dd      d|j#                  dd      dgd^ }}t3        |      }|j;                         D ]G  \  }}||vr|||<   ||   D ch c]  }|d   	 }}|D ]  }|d   |vs||   j=                  |         I ddlm }m!} d}|r,|jD                  r |jD                  xs i j#                  dd      } ||	j#                  dd      |	j#                  dd      |	j#                  dd       |jF                  xs d||	|jH                  !      } ||      } |j                  tJ              j	                  tJ        j
                  |k(        j                  tJ        j                        j1                         }!tL        jO                  d"i d#| d$|d%|d&|	d'|d(|
d)|d*|jP                  d+|jR                  xs d,d-|jT                  xs d.d/|jV                  xs d0d1|d2|d3| d4|!d5|j4                  xs i       }"|rXdd l,}# |#jZ                  d6d|      }$|"j\                  j_                         }%d7|$ d8}&|%ja                  d9|&d9z         }%tc        |%      S |"S c c}w c c}w w):Nr  r  r  r  r  r   _normalize_site_copyvalidate_site_copyvalidate_brandTauto_repairr(  r'  r  r  r   asset_idr  r   ri  otherr`  display_namezgraphics-pack)r  r  r3  ri  rh  ai_descriptiontagsgenerate_theme_configgenerate_theme_csstoner)  #4F46E5r+  #7C3AEDr-  #06B6D4r0  r1  r2  r]  
brand_toner  
atmosphere	site.htmlr   r<  r[  r  brand_optionsrC  rs  rF  rH  rG  rJ  rI  rL  rK  section_assetstheme	theme_cssr  r  z[^a-zA-Z0-9_-]zR<script>window.addEventListener("load",function(){var el=document.getElementById("z'");if(el)el.scrollIntoView()})</script>z</body>)2r  r   r   r    r   r  r  r{  r  r   app.services.aurarB  app.services.validatorsrD  rE  r[  rC  r   r   r&   r<  r'   rg  r  r  rk   r  r  r  rk  r  app.services.themerN  rO  summaryrE  rV  r$   r  r  rF  rH  rJ  rL  resubr+  decodera  r	   )'r   r  r<  r?  r   rs  rB  rD  rE  r[  rC  copy_reportbrand_reportr  r'  r  rq  rY  r  gpr  gp_flatr  gp_as_dictsgp_section_assetssecassets_listexisting_filesrN  rO  rU  rZ  r[  r  respr`  safe_idr+  scroll_scripts'                                          r   dev_previewro    s     ""4KLLhhw&&w':':f'DENNwOaOaOfOfOhiooqG4VWW6JMMRE$W%6%6%<"=I/	tLI{(DAE<iiq1Oii	2&G/6?SQX\;Y7?+hn{}_~L
((8

#
#HOOv$=
>
D
D
FCN
XXm,33M4N4NRURXRX4XY]]_
4Z@				$"B9!"%G   %%
#j"-ub)ee$4g>!eeNB7$%
   8D 1 7 7 9 	6C.(&1s#9G9L!MA!J-!M!M$ 6A}N:&s+22156	6 MJ
s{{kk'R,,VR8
!		/95))-y9yy3""(b%%E #5)Ixx ''(;(;v(EFOOPWPbPbcggiH%%k 474$f4.5|4e4,g47BI4 	74 -g.D.D4 	..8&	4
 	,,?4 	7??0j4 	.4 	4 $Y4 	H4 	..4"4 D "&&*B	:yy!mnumv  w_  `||I}y'@AD!!Ki "Ns&   G#R%A!R4R:RRG=Rz/logoutc                 X   K   | j                   j                          t        dd      S w)Nr   r   r   )r   clearr   r   s    r   logoutrs    s#     OOc::   (*z/adminc           
        K   | j                   j                  d      st        dd      |j                  t              j                  t        j                        j                         }|j                  t              j                  t        j                  dk(        j                         }|r|j                  dk(  nd}t        j                  d| ||| j                   j                  d	      d
dd      S w)Nr  r  Admin access requiredr  r   r   Fr  r   adminr  )r   usersr   current_usercurrent_pagecurrent_domain)r   r   r   r   r+   r  r{  r  r,   r   r   r   r   r  r  )r   r   rx  login_settingr   s        r   
admin_pager}    s     ??z*4KLLHHX''(;(;<@@BEHH[)00O1STZZ\M5BM''61M%%l&++J725  s   C5C7z/_dev_admin/{token}/roadmapz/admin/roadmapc                    K   |r|t         k7  rt        dd      S |s(| j                  j                  d      st	        dd      t
        j                  d| dd	d
      S w)NUnauthorizedr  r   r  rv  r  zadmin_roadmap.htmlroadmapr  r   rz  r{  )r  r	   r   r   r   r  r  r   r  s     r   platform_roadmap_pager    se      ,,N<<,,Z84KLL%%&:!R=  s   AAz$/_dev_admin/{token}/valuation-thesisz/admin/valuation-thesisc                   K   |r|t         k7  rt        dd      S |s(| j                  j                  d      st	        dd      t        |      }t        |d   t        |d   d	      z        |d
<   t        j                  d| dd|d      S w)Nr  r  r   r  rv  r  total_portfolio_valueanalyzedr   avg_per_domainzvaluation_thesis.htmlvaluation_thesisr  )r   rz  r{  rQ  )
r  r	   r   r   r   _compute_mastermind_summaryr  r  r  r  )r   r  r   rQ  s       r   valuation_thesis_pager  '  s      ,,N<<,,Z84KLL'+E#E*A$BSzIZ\]E^$^_E
%%&=*b@  s   B
Bz/admin/llm-strategyc                    K   | j                   j                  d      st        dd      t        j	                  d| ddd      S w)	Nr  r  rv  r  zllm_strategy.htmlllm_strategyr  r  r   r   r   r  r  rr  s    r   llm_strategy_pager  6  sI     ??z*4KLL%%&9&"<     AAz/_dev_admin/{token}/llm-routingz/admin/llm-routingc                    K   |r|t         k7  rt        dd      S t               }t        j	                  d| dd|d      S w)Nr  r  r   zllm_routing.htmlllm_routingr  )r   rz  r{  routing_data)r  r	   rC   r  r  )r   r  r  s      r   llm_routing_pager  @  sO      ,,N<<-/L%%&8%$	;  s   >A z/api/llm-routingc                     K   t               S wr  )rC   r   r   r   get_llm_routingr  N  s     %''   z/api/llm-routing/{stage}stagec                 
  K   |j                          d {   }|j                  d      }|j                  d      }|r|sddiS 	 t        | ||      }d|dS 7 A# t        t        f$ r}dt        |      icY d }~S d }~ww xY ww)Nprovidermodelr   zprovider and model requiredTsuccessroute)r/  r   rE   KeyError
ValueErrorr   )r  r   r+  r  r  r  r   s          r   set_llm_router  S  s     Dxx
#HHHWE5677!5(E2&11   j! !Q  !s?   BA.BA BB )A;5B 6B;B  Bc                 X   K   t        |        dt               j                  |       dS w)NTr  )rF   rD   r   )r  s    r   reset_llm_router  a  s'     n&6&:&:5&ABBrt  c                    | j                   xs i }i }t        |t              r^|j                  dg       }|j                  dd      }|r8t        |t              r(t        |      |kD  rt        ||   t              r||   ni }| j                  xs i }g }t        |t              rY|j                         D ]F  }t        |t              r|j                  |       %t        |t              s6|j                  |       H | j                  xs i }i }	| j                  ru	 t        | j                  t              rt        j                  | j                        n| j                  xs i }
dD ]%  }|
j                  |      s|dk(  rdn|}|
|   |	|<   ' 	 | j"                  | j$                  |j                  d      xs |j                  d      |j                  d	      |j                  d
      xs |j                  d      | j&                  xs i | j(                  | j*                  t        |t              r|j                  d      nd|| j,                  xs g dd}|j/                  |	       |S # t        j                  t         f$ r Y w xY w)a  Extract marketplace-compatible data from a Package ORM object.

    Package model stores brand identity nested in pkg.brand JSON,
    business docs in pkg.business_box JSON. This helper correctly
    unpacks those nested structures for marketplace scoring/pricing.
    r'  r  r   )market_researchcompetitor_analysisseo_strategyad_copyad_copy_suiteemail_sequencesr  r  
brand_namer   r  rz  colorsrZ  NF)r<  r]  r  r  rz  rC  rF  r(  rZ  r   r  deployed)r[  r1  rP  r   rl  r   r  r2  rm  r  rV  result_jsonr   r/  r0  r3  	TypeErrorr  rE  rC  rF  r(  r  update)pkgr[  brand_identityr'  rec_idxr  r   	tier_datarV  result_extrarjr   
mapped_keydatas                 r   _extract_pkg_datar  g  sA    IIOEN%))Ir*))-q1z'40S\G5K1;GG<Ld1SWW-Y[N##)rLM,%%,,. 	0I)T*$$Y/It,$$Y/		0 %2JL
	0:3??C0PCOO,WZWfWfWljlB A 766#;.1_.D#J/1#wL,7 //!!$((6T.:L:LV:T!%%i0&**>:Zn>P>PQY>Z]](b,,((,6z4,H(d&**0bD 	KKK% $$i0 		s   AI) ;I) )JJz&/api/marketplace/summary/{domain_name}c                 ,  K   |j                   j                  d      st        dd      ddlm} |j                  t              j                  t        j                  | k(        j                         }|st        dd       |t        |            S w)	Nr   r   Auth requiredr  r   )get_marketplace_summaryr  r  )r   r   r   app.services.marketplacer  r   r    r   r  r   r  )r  r   r   r  r  s        r   marketplace_summaryr    sw     ??z*ODD@
((7

"
"7#6#6+#E
F
L
L
NC4GHH"#4S#9::s   BBz&/api/marketplace/pricing/{domain_name}r  c                 .  K   |j                   j                  d      st        dd      ddlm} |j                  t              j                  t        j                  | k(        j                         }|st        dd       |t        |      |      S w)	Nr   r   r  r  r   )calculate_listing_pricer  r  )r   r   r   r  r  r   r    r   r  r   r  )r  r  r   r   r  r  s         r   marketplace_pricingr    sy     ??z*ODD@
((7

"
"7#6#6+#E
F
L
L
NC4GHH"#4S#94@@   BBz/api/marketplace/tiersc                 t   K   | j                   j                  d      st        dd      ddlm}  |       S w)Nr   r   r  r  r   )get_all_tiers)r   r   r   r  r  )r   r  s     r   marketplace_tiersr    s0     ??z*ODD6?s   68z,/api/marketplace/build-missing/{domain_name}c                   K   |j                   j                  d      st        dd      |j                  t              j                  t        j                  | k(        j                         }|st        dd      i }	 |j                          d {   }|j                  dg       }t        t        j                               }t        j                  j                         }t        |d| d	d
ddddg |||      }|j!                  |       |j#                          t%        j&                  t(        || fd|id      j+                          t-        |d	d      S 7 # t        $ r Y w xY ww)Nr   r   r  r  r  r  
componentsbuild_missingr  rt  rQ  r   r   rl  rm  r<  ru  rv  rw  rx  rn  ry  ro  rz  r{  r|  requested_componentsTtargetargsr  daemonrl  ru  )r   r   r   r   r    r   r  r   r/  r   r   r  r  r  r  r"   r   r   r   Thread_run_build_missing_componentsstartr
   )	r  r   r   r  r+  r  rl  r  r  s	            r   marketplace_build_missingr    sB    ??z*ODD
((7

"
"7#6#6+#E
F
L
L
NC4GHHD\\^# ,+JF



"
"
$C
kFqqr33	C FF3KIIK,k"&
3	
 eg6X>??) $ s=   A=E, E EE CE,E 	E)&E,(E))E,z'/api/marketplace/research/{domain_name}c                 d  K   |j                   j                  d      st        dd      ddlm} |j                  t              j                  t        j                  | k(        j                         }|st        dd       ||j                  |j                  xs d	       d {   }|S 7 w)
Nr   r   r  r  r   run_market_researchr  r  r	  )r   r   r   r  r  r   r    r   r  r   rE  )r  r   r   r  r  r  s         r   marketplace_researchr    s     ??z*ODD<
((7

"
"7#6#6+#E
F
L
L
NC4GHH&s8H8H8UIVVFM Ws   B%B0'B.(B0z&/api/marketplace/listing/{domain_name}c                   K   |j                   j                  d      st        dd      ddlm} |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  j                  d	      d
k(  r|j                          d {   ni }|j                  dd      }t        |      } ||j                  |j                  xs d||       d {   }|S 7 P7 w)Nr   r   r  r  r   generate_listing_copyr  r  r  application/jsonr  professionalr	  )r   r   r   r  r  r   r    r   r  r   r  r/  r  rE  )	r  r   r   r  r  r  r  pkg_datar  s	            r   marketplace_listingr    s     ??z*ODD>
((7

"
"7#6#6+#E
F
L
L
NC4GHH#*??#6#6~#FJ\#\bdD88FN+D %H(#:J:J:WiYacghhFM	   is%   B2D	4D5A	D	>D?D	D	z/marketplacec           	      >  K   | j                   j                  d      st        dd      S ddlm}m} |j                  t              j                  t        j                  j                               j                         }t        j                  d| d|||d	      S w)
Nr   r   r   r   r   PRICING_TIERSPACKAGE_COMPONENTSmarketplace.htmlmarketplacer   rz  tiersr  packages)r   r   r   r  r  r  r   r    r  r{  r  r  r  r  )r   r   r  r  r  s        r   marketplace_pager    s     ??z*c::Jxx ))'*<*<*A*A*CDHHJH%%&8%(;  s   BBz/_dev_admin/{token}/marketplacec           	        K   |t         k7  rt        dd      ddlm}m} |j                  t              j                  t        j                  j                               j                         }t        j                  d| d|||d      S w)	Nr  Invalid tokenr  r   r  r  r  r  )r  r   r  r  r  r   r    r  r{  r  r  r  r  )r   r  r   r  r  r  s         r   dev_marketplace_pager    sz     ""ODDJxx ))'*<*<*A*A*CDHHJH%%&8%(;  s   B	Bz/admin/model-shootoutc                    K   | j                   j                  d      st        dd      t        j	                  d| ddd      S w)	Nr  r  rv  r  zmodel_shootout.htmlmodel_shootoutr  r  r  rr  s    r   model_shootout_pager    sI     ??z*4KLL%%&;(B>  r  z/api/admin/shootout/runc                 X  K   | j                   j                  d      st        dd      | j                          d {   }|j                  dd      j	                         j                         }|j                  dd      }|j                  dd      }|r|st        d	d
      dd l}ddlm} d|v r|j                  d      d   n|}d|v r|j                  d      d   nd}	d| d| d|	 d| d	}
ddt        j                  j                  d      t        j                  j                  d      dddddt        j                  j                  d      t        j                  j                  d      ddddd t        j                  j                  d!      t        j                  j                  d"      d#d$ddd%t        j                  j                  d!      t        j                  j                  d"      d&ddd'd(d)t        j                  j                  d*      d+d,dd'd-d)t        j                  j                  d*      d+d,dd.}|j                  |      }|st        d	d/|       |d0   sd1|d2|d3    d4S |j                         }	  ||d0   |d5   6      }d7d8d9d:|
d9g}|d;   |d<d=}|d3   d'k7  rd>d?i|d@<   d<|dA<   |dB=  |j                  j                  j                  d`i |}t        |j                         |z
  dCz        }|j                   d   j"                  j$                  xs d}|j&                  rt)        |j&                  dDd      nd}|j&                  rt)        |j&                  dEd      nd}||z   }|dFz  |dG   z  |dFz  |dH   z  z   }d }t+        |dI      r|j,                  r|j,                  }d }d}d}	 |j	                         }|j/                  dJ      r6|j                  dKdL      d   j1                  dJdL      d   j	                         }|j3                  dM      }|j5                  dN      dLz   }|dk\  r||kD  rt        j6                  |||       }|j                  dOg       }t9        |      }|D  cg c]:  } t;        | j                  dP      t        t<        f      s)| j                  dPd      < }!} |!r!t?        tA        |!      t9        |!      z  dQ      nd}ddRl"m#}"  |"||||d3   |d dS |||||||t?        |dT      ||rdUndVW      }#|jI                  |#       |jK                          |rdUndV||d3   ||||t?        |dT      |||||s|d dX dYS d dYS 7 )c c} w # tB        $ r Y w xY w# tB        $ r}$t        |j                         |z
  dCz        }tL        jO                  dZ| d[|$        ddRl"m#}"  |"||||d3   tQ        |$      d d\ |d1]      }#|jI                  |#       |jK                          d1||d3   tQ        |$      d d^ |d_cY d }$~$S d }$~$ww xY ww)aNr  r  rv  r  r<  r  model_idshootout_id  zDomain and model requiredr   OpenAIr  comzAnalyze the domain name "z4" for business potential.

The domain name part is "z" with TLD ".a  ".

Break down the domain into keywords and explore creative interpretations including:
- Literal meanings
- Acronyms (what could each letter stand for?)
- Cross-language meanings (Spanish, French, German, Japanese, etc.)
- Mashups and portmanteaus
- Cross-domain tie-ins
- Industry-specific interpretations

Generate 7-10 niche business ideas for this domain. For EACH niche, consider:
- Whether an affiliate program exists in that industry (list specific programs if known)
- Whether it could work as a passive/semi-passive income site
- How brandable the domain is for that niche

For each niche, provide:
- "name": short niche name (2-5 words)
- "description": 3-4 sentence description of the business concept, what it does, who it serves, and why it's viable
- "synopsis": A one-paragraph executive summary of what this business would look like
- "monetization_model": primary revenue method
- "affiliate_programs": list of specific affiliate programs or networks
- "target_audience": who would use this site
- "time_to_revenue": one of "fast", "medium", "slow"
- "valuation_band": estimated domain+business value range
- "score": 0-10 rating of viability and potential
- "requires_inventory": boolean

Return JSON in this exact format:
{{
  "domain": "z",
  "keywords": ["keyword1", "keyword2"],
  "interpretations": ["interpretation1", "interpretation2"],
  "domain_summary": "A one-paragraph summary",
  "niches": [...]
}}openaigpt-4oAI_INTEGRATIONS_OPENAI_BASE_URLAI_INTEGRATIONS_OPENAI_API_KEY      @      $@)r  r  r  api_keyinput_cost_per_moutput_cost_per_mgpt-5       @g       @googlegemini-2.5-flashAI_INTEGRATIONS_GEMINI_BASE_URLAI_INTEGRATIONS_GEMINI_API_KEY333333?333333?gemini-2.5-pro      ?
perplexity	sonar-prohttps://api.perplexity.aiPERPLEXITY_API      @      .@sonar-reasoning)r  r  r  r  r
  r  zUnknown model: r  r   zAPI key not configured for r  )ru  r  r   r  r  r  systemzYou are a domain analysis expert specializing in identifying profitable online business niches with affiliate and monetization potential. Return ONLY valid JSON.roler  r  r      r  messages
max_tokensr
  json_objectresponse_formatmax_completion_tokensr  r?  prompt_tokenscompletion_tokens@B r  r  	citationsr   
r   r#  }r  scorerR  ModelShootoutResultP  r   r  parse_error)r  r  
model_namer  raw_responseparsed_resultniche_countavg_niche_scoreresponse_time_msinput_tokensoutput_tokenstotal_tokenscost_estimater  ru    )ru  r  r  r+  r,  r-  r.  r/  r)  r*  r  r(  r'  zShootout error for r}    )r  r  r&  r  error_messager+  ru    )ru  r  r  r   r+  r   ))r   r   r   r/  r-  r  timer  r  splitr   environchatcompletionscreateintchoicesmessager  usager  hasattrr  r   rsplitfindrfindr0  r   r1  floatr  r  r   
app.modelsr#  r   r   r   r   r   )%r   r   r  r<  r  r  r4  ShootoutOpenAI	name_parttldpromptMODEL_CONFIGSr   
start_timemodel_clientr  create_kwargsr  
elapsed_msraw_contentr,  r-  r.  costr  r6  r)  	avg_scorer5  	start_idxend_idxr  nscoresr#  result_recordr   s%                                        r   run_shootoutrU    s    ??z*4KLLDXXh#))+113Fxx
B'H((="-K4OPP/(+vS!!$6I#&&=&,,s
B
eC*6( 3#M# 7: X ?$FP !

'HIzz~~&FG $!&
 !

'HIzz~~&FG $!%
 !'

'HIzz~~&FG $!%
 !%

'HIzz~~&FG $!&
 % 3zz~~&67 $!&
 %&3zz~~&67 $!&
S1Mf x(FohZ4PQQ)!HA\]cdn]o\p?qrrJo
%fY.?&Q[J\]   +N  O/
 G_ 

 *-06/FM+,59M12l+7<$$0077H-H$))+
2d:;
&&q)1199?RFNnnwx~~BZ[KS>>0CQG_`#m3y(62D+EE-ZcJcfl  nA  gB  KB  C	8[)h.@.@ **I		!'')G!!%(!--a04;;E1EaHNNPS)ImmC(1,GA~'I"5GIg$>?Hb1!&k5;hz!%%PW.[^`eZf?g!%%+hhCIE#f+F";Q?q	 	3+#J'$Ve, #%'%'%a. &9M
" 	}
		 $*i}z* *(*("4^&("#6<K.
 	
 CG
 	
o  z i 		P  
$))+
2d:;
*8*Bqc:;2+#J'a&$-'
 	}
		 z*VDS\ *
 	
#
s   <X*U'IX*D8U> B?U/ *U*0U*'U/ +A7U> "X*#U> &X**U/ /	U;8U> :U;;U> >	X'BX"X'X*"X''X*z/api/admin/shootout/historyc                 >  K   | j                   j                  d      st        dd      ddlm} |j                  |      j                  |j                  j                               j                  d      j                         }i }|D ]  }|j                  |vrF|j                  |j                  r|j                  j                         dz   nd g d	||j                  <   ||j                     d
   j                  |j                  |j                   |j"                  |j$                  |j&                  |j(                  |j*                  |j,                  |j.                  rt1        |j.                        ndd	        dt3        |j5                               d d iS w)Nr  r  rv  r  r   r"  r,  Z)r<  r{  resultsrX  )	r  r  ru  r)  rO  r+  tokensrN  r  	shootoutsr\  )r   r   r   rC  r#  r   r  r{  r  limitr  r  r  r  r  r&  r  ru  r)  r*  r+  r.  r/  r  r   rl  r2  )r   r   r#  recentgroupedrs         r   shootout_historyr_    sY    ??z*4KLL.XX)*334G4R4R4W4W4YZ``adeiikFG =='01opo{o{Q\\McMcMehkMk  BF  SU  &VGAMM"y)00\\qzzQXX==q7H7H ! 2 2annOOakk#akk2BWX	2
 	 gnn./455s   FFz/api/admin/toggle-loginc                   K   | j                   j                  d      st        dd      |j                  t              j                  t        j                  dk(        j                         }|st	        dd      }|j                  |       n|j                  dk(  rdnd|_	        |j                          d|j                  dk(  iS w)	Nr  r  rv  r  r   r   r  false)r   r   r   r   r,   r   r   r   r   r   r   )r   r   r   s      r   toggle_loginrb    s     ??z*4KLLhh{#**;??o+MNTTVG/@
w#*==F#:IIKW]]f455s   CCz/api/admin/usersc                   K   | j                   j                  d      st        dd      | j                          d {   }|j                  dd      j	                         }|j                  dd      }|j                  dd      }|r|st        d	d
      t        |      dk  rt        d	d      |j                  t              j                  t        j                  |k(        j                         }|rt        d	d      t        ||      }|j                  |       |j                  |       |j                          |j                  |j                  |j                  dS 7 *w)Nr  r  rv  r  r   r  r  Fr  zUsername and password requiredr   z&Password must be at least 4 characterszUsername already existsr  )r  r   r  )r   r   r   r/  r-  r   r   r+   r   r   r   r  r   r   r  r  )r   r   r  r   r  r  r   r  s           r   create_userrd  %  s$    ??z*4KLLDxx
B'--/Hxx
B'Hxx
E*H84TUU
8}q4\]]xx!(():):h)FGMMOH4MNNX9DhFF4LIIK''t}}$--PP  s   <E+E(D*E+z/api/admin/users/{user_id}user_idc                   K   |j                   j                  d      st        dd      |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  |j                   j                  d      k(  rt        dd	      |j                  |       |j                          d
diS w)Nr  r  rv  r  r  zUser not foundr   r  zCannot delete your own accountdeletedT)r   r   r   r   r+   r   r  r   r   r  r   )re  r   r   r  s       r   delete_userrh  ;  s     ??z*4KLL88H$$X[[G%;<BBDD4DEE}}++J774TUUIIdOIIKts   CCtemplatec                   K   |j                  t              j                  t        j                  j	                               j                         }t               }	 |j                  t              j                  t        j                  dk(        j                         }|D ch c]  }|j                   }}i }	 |j                  t        j                  t        j                        j                  t        t        j                   t        j"                  k(        j                  t        j$                  dk(  t        j&                  j)                  g d      t        j                  dk(        j                         }|D ]  \  }	}
|
|vsd|	z   ||
<    	 g }dddddd	d
}|D ]x  }|j*                  s|j,                  r|j,                  d   nd }|j*                  r|j*                  j/                  dg       ng }|r|d   nd }t               }|r8|j0                  r,|j0                  D ]  }|j3                  |j4                          t               }|D ]#  }|j3                  |j/                  |d	             % |r|j6                  nd }d}t               }|rt9        |t:              r}|j/                  dg       }|rCt9        |t<              r3|D ]-  }|dz  }|j/                  dd      }|s|j3                  |       / n&h d}|D ]  }||v s|dz  }|j3                  |        d}|r|j>                  rwt9        |j>                  t:              r]|j>                  j/                  dg       }|j>                  j/                  dd      }|r#tA        |      |kD  r||   j/                  dd      }tC        |j*                        } tC        |      }!|d u}"tC        |xr |j>                        }#tC        |xr |jD                        }$tC        |xr |jF                        }%tC        |xr& |j0                  xr tA        |j0                        dkD        }&|j                  |v }'d}(| r|(dz  }(|!r|(dz  }(|"r|(dz  }(|#r|(dz  }(|$r|(dz  }(|%r|(dz  }(|&r|(dz  }(|'r|(dz  }(d})d}*d}+	 tI        |j                  |j*                        },|,j/                  dd      })|,j/                  dd      }*|,j/                  dd      }+g }-|(dk\  r|'s|%r|$r|-jK                  d       |*dk\  r|(dk  r|-jK                  d        |+d!k\  r|-jK                  d"       |(d#k  s|"s|-jK                  d$       |jK                  i d%|j                  d&|j                  r|j                  d   jM                         nd'd(|jN                  d)tA        |      d*|r|j/                  d+d      ndd,|r|j/                  d-d      ndd.|r|j/                  d/d      ndd0|r|j/                  d1d      ndd2|j*                  r#|j*                  j/                  d3d      xs dd d4 ndd5|"d6|#d7|$d8|%d9|&d:|r!|j0                  rtA        |j0                        ndd;t=        |      d<t=        |      |'|r|jP                  nd|r|jR                  n|jN                  ||j/                  |j                        xs |r|jD                  nd |t=        |      |(tU        |)      tU        |*      tU        |+      |-d=       { tA        |      }.tW        d> |D              }/tW        d? |D              }0tW        d@ |D              }1tW        dA |D              }2tW        dB |D              }3tU        tW        dC |D              tY        |.d      z        }4tU        tW        dD |D              tY        |.d      z  d      }5tW        dE |D              }6tW        dF |D              }7|.|/|0|1|2|3|4|5|6|7tU        |0tY        |.d      z  dGz        tU        |/tY        |.d      z  dGz        dH}8|j                  tZ              j                  tZ        j\                  dIk(        j_                         }9|9r+|9j`                  rtc        jd                  |9j`                        ng }:tf        ji                  || |||8|:dJddK      S c c}w # t        $ r Y !w xY w# t        $ r Y Uw xY w# t        $ r Y w xY ww)LNr  r`  r-  r  r  
calculatorlmsgalleryr   r  roi_calculator
assessment	checklistrR  configuratorr   r  r  r   r
  r  >   ctarP  rG  rM  rJ  rQ  footercontactrm  rO  problemrN  solution	cta_final	resourcesrR  how_it_worksrK  #6366F1r'  r  r)  rh  r\  r^  domain_only_valuebest_developed_valuebest_monthly_netU   
flip-readyr0  2   	quick-winr3  high-roi(   
needs-workr<  first_letter?r  r)  	top_nicher   	top_scorer!  monetizationmonetization_modelrevenue_speedtime_to_revenuer_  domain_summaryx   has_package	has_brandhas_hero	has_saleshas_augmentsaugment_countaugment_typescontent_iconsis_deployedrE  r|  brand_colorhero_urlsection_countsection_typescompletion_pctr|  r}  r~  decision_badgesc              3   ,   K   | ]  }|d    s	d  ywr  r   Nr   r  ps     r   r  z$_render_dashboard.<locals>.<genexpr>       DA1]3CaD   
c              3   ,   K   | ]  }|d    s	d  ywr  r   Nr   r  s     r   r  z$_render_dashboard.<locals>.<genexpr>  r  r  c              3   ,   K   | ]  }|d    s	d  ywr  r   Nr   r  s     r   r  z$_render_dashboard.<locals>.<genexpr>       DaQ{^Dr  c              3   &   K   | ]	  }|d      ywr}  Nr   r  s     r   r  z$_render_dashboard.<locals>.<genexpr>       Kq12K   c              3   &   K   | ]	  }|d      ywr~  Nr   r  s     r   r  z$_render_dashboard.<locals>.<genexpr>       IQ1/0Ir  c              3   &   K   | ]	  }|d      ywr  Nr   r  s     r   r  z$_render_dashboard.<locals>.<genexpr>       !N!!$4"5!Nr  c              3   &   K   | ]	  }|d      ywr  Nr   r  s     r   r  z$_render_dashboard.<locals>.<genexpr>       DQ{^Dr  c              3   2   K   | ]  }|d    dk\  sd  ywr}  r0  r   Nr   r  s     r   r  z$_render_dashboard.<locals>.<genexpr>       WaQ7M5NRV5VWr  c              3   0   K   | ]  }d |d   v sd  ywr  r  r   Nr   r  s     r   r  z$_render_dashboard.<locals>.<genexpr>       Za\QGXEY5YZ   r,  total_domainswith_packagesr  
with_salesr  total_monthly_netavg_completionrO  high_value_countflip_ready_countdeploy_ratepackage_ratefavorite_niches	dashboardr   r   portfolio_dataportfolio_aggregatesr  rz  r{  5r   r   r  r{  r  r  r   r2   r   ru  r<  r   r'   r3  r&   rb  rg  r  rh  ri  r  r  r  r   r  r   r  rC  r1  rP  rl  r[  r   boolrF  r(  rW   r  upperr  rE  r|  r  r  r  r,   r   r   r   r/  r0  r  r  );r   r   ri  r   deployed_domainsdeploy_logsdlbk_hero_map	bk_assets
asset_path	bk_domainr  content_type_mapr  r  r  r  augment_types_setr"  r  atrC  r  r  sections_listri  stKNOWN_SECTIONSr   r  
brand_optsr  has_analysis	has_nicher  r  r  r  r  r  r  r|  r}  r~  
val_resultr  pf_totalpf_with_pkgpf_deployedpf_with_salespf_total_valuepf_total_monthlypf_avg_completionpf_avg_scorepf_high_valuepf_flip_readyr  fav_settingr  s;                                                              r   _render_dashboardr  I  s    hhv''(9(9(>(>(@AEEGGuhh}-44]5I5I[5XY]]_0;<"BII<< KHH]44hooFKKm00HKK?

&$$/((,,-_`OOw&
 #% 	 &/ 	:!J	+),z)9I&	:
 N!\%yZ_  bzz zzajjmt12"-!'F1IT	E3<<|| 8!%%c&6&678# 	?B.222u=>	?%(CMMd	It4%MM*b9MM4!@( .C!Q&M,B%))"-	."a % /Cn,%*%))#./  399CIIt!<y"5Jiimm$5q9Gc*o7(155oyQAJJ'O	o*+	2 2 231!1!12	CJCLLJS5F5JKhh"222-n*n",n*n^r)^n*n2-", 	'!**=J */BA F#->>2H!#L )~~.@!D R[Y8""<04'NR,?"";/s""":.Bk""<0 
ahh
188AHHQK--/
 1==
 3v;	

 ivr2R
 iw2Q
 yIMM*>CVX
 YY]]+<bATV
 QZZ

'7<BDSI]_
 ;
 )4Y
 AKH
 
 %3L
 ##,,S.A
 T"34
 7FtMGZ
 'C8H8HUW,/#..Q]]&#1ZCc6H6HUY*T-=P,!&'8!9$)*>$? %&6 7./
 	UbF >"HDDDKDDDKD>DDMKNKKNI.IIc!N~!NNQTU]_`QaabD^DDs8UVGWWYZ[LW>WWMZ>ZZM!K[#n-AR!})[3x+;;cABkC!,<<sBC ((;'..{BS/STZZ\K7B{GXGXdjj!2!23^`O%%hw(BV*K[]1  ] =   L  		   Ac=Ac #c6c 8c=;Cc 	
c Ec=)!c=Fc=Ac-1Oc=c 	cc=cc=	c*&c=)c**c=-	c:6c=9c::c=z/_dev_admin/{token}/dashboardr  c                   K   |j                  t              j                  t        j                  j	                               j                         }t               }	 |j                  t              j                  t        j                  dk(        j                         }|D ch c]  }|j                   }}i }	 |j                  t        j                  t        j                        j                  t        t        j                   t        j"                  k(        j                  t        j$                  dk(  t        j&                  j)                  g d      t        j                  dk(        j                         }|D ]  \  }	}
|
|vsd|	z   ||
<    	 g }dddddd	d
}|D ]x  }|j*                  s|j,                  r|j,                  d   nd }|j*                  r|j*                  j/                  dg       ng }|r|d   nd }t               }|r8|j0                  r,|j0                  D ]  }|j3                  |j4                          t               }|D ]#  }|j3                  |j/                  |d	             % |r|j6                  nd }d}t               }|rt9        |t:              r}|j/                  dg       }|rCt9        |t<              r3|D ]-  }|dz  }|j/                  dd      }|s|j3                  |       / n&h d}|D ]  }||v s|dz  }|j3                  |        d}|r|j>                  rwt9        |j>                  t:              r]|j>                  j/                  dg       }|j>                  j/                  dd      }|r#tA        |      |kD  r||   j/                  dd      }tC        |j*                        } tC        |      }!|d u}"tC        |xr |j>                        }#tC        |xr |jD                        }$tC        |xr |jF                        }%tC        |xr& |j0                  xr tA        |j0                        dkD        }&|j                  |v }'d}(| r|(dz  }(|!r|(dz  }(|"r|(dz  }(|#r|(dz  }(|$r|(dz  }(|%r|(dz  }(|&r|(dz  }(|'r|(dz  }(d})d}*d}+	 tI        |j                  |j*                        },|,j/                  dd      })|,j/                  dd      }*|,j/                  dd      }+g }-|(dk\  r|'s|%r|$r|-jK                  d       |*dk\  r|(dk  r|-jK                  d        |+d!k\  r|-jK                  d"       |(d#k  s|"s|-jK                  d$       |jK                  i d%|j                  d&|j                  r|j                  d   jM                         nd'd(|jN                  d)tA        |      d*|r|j/                  d+d      ndd,|r|j/                  d-d      ndd.|r|j/                  d/d      ndd0|r|j/                  d1d      ndd2|j*                  r#|j*                  j/                  d3d      xs dd d4 ndd5|"d6|#d7|$d8|%d9|&d:|r!|j0                  rtA        |j0                        ndd;t=        |      d<t=        |      |'|r|jP                  nd|r|jR                  n|jN                  ||j/                  |j                        xs |r|jD                  nd |t=        |      |(tU        |)      tU        |*      tU        |+      |-d=       { tA        |      }.tW        d> |D              }/tW        d? |D              }0tW        d@ |D              }1tW        dA |D              }2tW        dB |D              }3tU        tW        dC |D              tY        |.d      z        }4tU        tW        dD |D              tY        |.d      z  d      }5tW        dE |D              }6tW        dF |D              }7|.|/|0|1|2|3|4|5|6|7tU        |0tY        |.d      z  dGz        tU        |/tY        |.d      z  dGz        dH}8|j                  tZ              j                  tZ        j\                  dIk(        j_                         }9|9r+|9j`                  rtc        jd                  |9j`                        ng }:tf        ji                  dJ| |||8|:dKddL      S c c}w # t        $ r Y !w xY w# t        $ r Y Uw xY w# t        $ r Y w xY ww)MNr  r`  r-  r  r  rk  rl  rm  r   rn  r   r  r  r   r
  r  >   rs  rP  rG  rM  rJ  rQ  rt  ru  rm  rO  rv  rN  rw  rx  ry  rR  rz  rK  r{  r'  r  r)  rh  r\  r^  r|  r}  r~  r  r  r0  r  r  r3  r  r  r  r<  r  r  r  r)  r  r   r  r!  r  r  r  r  r_  r  r  r  r  r  r  r  r  r  r  r  c              3   ,   K   | ]  }|d    s	d  ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  c              3   ,   K   | ]  }|d    s	d  ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  c              3   ,   K   | ]  }|d    s	d  ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  c              3   &   K   | ]	  }|d      ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  c              3   &   K   | ]	  }|d      ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  c              3   &   K   | ]	  }|d      ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  c              3   &   K   | ]	  }|d      ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  c              3   2   K   | ]  }|d    dk\  sd  ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  c              3   0   K   | ]  }d |d   v sd  ywr  r   r  s     r   r  zdashboard.<locals>.<genexpr>  r  r  r,  r  r  dashboard.htmlr  r  r  );r   r   r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r  r  rC  r  r  r  ri  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  s;                                                              r   r  r    s     hhv''(9(9(>(>(@AEEGGuhh}-44]5I5I[5XY]]_0;<"BII<< KHH]44hooFKKm00HKK?

&$$/((,,-_`OOw&
 #% 	 &/ 	:!J	+),z)9I&	: N!&  yzz zzajjmt12"-!'F1IT	E3<<|| 8!%%c&6&678 # 	?B.222u=>	? &)CMMd	It4%MM*b9MM4!@( .C!Q&M,B%))"-	."g % /Cn,%*%))#./
  399CIIt!<y"5Jiimm$5q9Gc*o7(155oyQAJJ'O	o*+	2 2 231!1!12	CJCLLJS5F5JKhh"22b Nb Nb Nb Nb Nb Nb Nb N 	'!**=J */BA F#->>2H!#L )~~.@!D R[Y8""<04'NR,?"";/s""":.Bk""<0 
ahh
188AHHQK--/
 1==
 3v;	

 ivr2R
 iw2Q
 yIMM*>CVX
 YY]]+<bATV
 QZZ

'7<BDSI]_
 ;
 
 
 
 L
 ##,,S.A
  T"34!
" T-0#
$ '03C,,,/#..Q]]&#1ZCc6H6HUY*!-0,!&'8!9$)*>$? %&6 7.;
 	wyv >"HDDDKDDDKD>DDMKNKKNI.IIc!N~!NNQTU]_`QaabD^DDs8UVGWWYZ[LW>WWMZ>ZZM "$#!/-+!))[3x+;;cABkC!,<<sBC ((;'..{BS/STZZ\K7B{GXGXdjj!2!23^`O%%&6( 4*#9  k =   v  		r  z%/_dev_admin/{token}/dashboard-sidebarz/dashboard-sidebarc                 :   K   t        | |d       d {   S 7 w)Nzdashboard_sidebar.html)ri  )r  )r   r   r  s      r   dashboard_sidebarr    s      #7B9QRRRRs   z"/api/domain/{domain}/default-nichec                 N  K   |j                          d {   }|j                  d      }|j                  t              j	                  t        j
                  | k(        j                         }|st        dd      ||_        |j                          d|j                  dS 7 w)Nr]  r  r  r  )ru  r   )
r/  r   r   r   r   r<  r   r   r   r   )r<  r   r   r  r]  doms         r   api_set_default_nicher    s     DHHWE
((6

!
!&--6"9
:
@
@
BCC!344CIIKS->->??  s   B%B#BB%z/api/favorite-nichesc                    K   | j                  t              j                  t        j                  dk(        j	                         }|r+|j
                  rt        j                  |j
                        ng }d|iS w)Nr  	favoritesr   r,   r   r   r   r   r/  r0  )r   r   r   s      r   api_get_favorite_nichesr    sY     hh{#**;??>O+OPVVXG-4

7==)BI##   A7A9z/api/favorite-niches/togglec                   K   | j                          d {   }|j                  dd      j                         }|st        dd      |j	                  t
              j                  t
        j                  dk(        j                         }|r+|j                  rt        j                  |j                        ng }||v r|j                  |       n,t        |      dk  r|j                  |       nt        dd      |rt        j                  |      |_	        n/|j                  t        dt        j                  |                   |j!                          d	|iS 7 Gw)
Nr]  r  r  zNiche requiredr  rh  zMax 10 favoritesr  r   )r/  r   r-  r   r   r,   r   r   r   r   r0  remover   r  dumpsr   r   )r   r   r  r]  r   r   s         r   api_toggle_favorite_nicher    s    DHHWb!'')EC!122hh{#**;??>O+OPVVXG-4

7==)BI		Y"	C!344

9-
{0

98MNOIIK###  s   E EEE z/api/analyze-domainreqc                   K   | j                   j                         j                         }|st        dd      | j                  xs dj                         }t        t        j                               d d }||d}t        |d|t        t              dz
  t        |	       t        j                  t        |||       ||d
dS w)Nr  zDomain name is requiredr  r  r  r<  r=  r  r   r  startedrl  r<  ru  )r<  r-  r  r   r=  r   r  r  r  r   r  r   r  r  )r  r  r=  rl  rp  s        r   api_analyze_domainr    s     **""$**,K4MNN??(b//1Kr"F)+FLvy+s>/BQ/Feqr(&+{KyIIs   CCz/api/batch-analyzec           
      *  K   t               }	 |j                  t              j                  t        j                  dk(  t        j
                  j                  ddg            j                         }|r-d|j                   d|j                  d|j                          S 	 |j                          | j                          d {   }|j                  dg       }|j                  dd	      xs d	j                         }|j                  d
d      }t        |t              rM|j                  dd      j!                  d      D cg c]#  }|j                         s|j                         % }}g }t#               }	|D ]J  }|j                         j%                         }|s$||	vs)|	j'                  |       |j)                  |       L |st+        dd      t-        |      dkD  rt+        dd      g }
|rt               }	 |j                  t.        j0                        j                  t.        j0                  j                  |      t.        j2                  j5                  d             j7                         }|D ch c]  }|d   	 }}|rJ|D cg c]	  }||v s| }
}|D cg c]	  }||vs| }}t8        j;                  dt-        |
       d       |j                          |s!|
rd dt-        |
      |
ddt-        |
       ddS dt        tA        jB                               d d  }tE        |dt-        |       dt-        |      g ||d       tG        |      }|tH        |<   tJ        jM                  tN        |||       |t-        |      t-        |
      |
d d  d!d"S # |j                          w xY w7 c c}w c c}w c c}w c c}w # t<        $ r#}t8        j?                  d|        Y d }~d }~ww xY w# |j                          w xY ww)#Nr  r  rs  zA batch is already running (+). Wait for it to finish, or stop it first.r   active_batch_idr   r=  r  skip_existingT,r  r  zNo valid domains providedr  r3  zMaximum 500 domains per batchr   zBatch dedup: skipping z already-analyzed domainsz.Batch dedup check failed (proceeding anyway): all_existingzAll zL domains already have analysis. Use 'Re-analyze All' to force re-processing.)r   r  r  skipped_domainsru  r<  zbatch-r   domains)r   r=  r  r\  r  )r   r  r  r  ru  )(r   r   r"   r   rm  ru  r  r   rl  r   r/  r   r-  r1  r   ra  r5  r   r  r   r  r   r   r   r<  r  isnotr  r   r   r   r  r  r  r  r   r  r   r  r  )r   db_guardactive_batchr+  raw_domainsr=  r  r  r   seenr  db_checkexisting_domainsrowexisting_setr   r   r  s                     r   api_batch_analyzer     s    ~H~~c*11LLO+JJNNIy12
 %' 	 ;L<O<O;PP{|  R^  Re  Re  f  	D((9b)K88M2.4";;=KHH_d3M+s#*5*=*=c4*H*N*Nt*TbQXYX_X_XaqwwybbG5D GGIOO$HHQKNN1	 4OPP
7|c4STTG>	'~~fmm<CC!!'*%%d+  ce  /??sCF?L?&-Cl1B1CC&-G,1F1GG4S\NB[\] NNw7|&$c'l^+wx
 	
 DJJL)"1-./HxS\N(*CS\SU(/LN x E#M(77KX Ww<"3B< y 	 c. @CG 	QNNKA3OPP	Q NNs   PBN# P!#PN8A?PN;N;,3P P%APA;O =O 	O 	OOO %	O
/O
3$O CP#N55P;P O 	O;O60O> 6O;;O> >PPz/api/batch/activec                  
  K   t               } 	 | j                  t              j                  t        j                  j                  ddg      t        j                  j                  g d            j                  t        j                  j                               j                  d      j                         }d|D cg c]  }|j                          c}i| j                          S c c}w # | j                          w xY ww)Nr  batch_build)r  rs  r  r   batches)r   r   r"   r   rm  r  ru  r  r{  r  r[  r  r  r   )r   r   r  s      r   api_active_batchesr$  :	  s     	B#%%LLo}=>JJNN;<
 (3>>&&(
)%%(335 	 8AAIIK89

 9

s/   DB0C. >C)C. D)C. .D  Dz/api/batch-buildc           
      	  K   t               }	 |j                  t              j                  t        j                  dk(  t        j
                  j                  ddg            j                         }|r-d|j                   d|j                  d|j                          S 	 |j                          | j                          d {   }|j                  dg       }|j                  dg       }|j                  d	i       }|j                  d
i       }|j                  dd      }|j                  dd      }	|j                  d|dk(         |j                  d|	       |r|st               }
	 |
j                  t        j                  t        j                        j                  t        j                  j                  |            j!                         }|D cg c]  }|j                   }}|
j                          |s|st#        dd      |r|st               }	 |j                  t              j                  t        j$                  j'                  d             }|j                  dd      j)                         j+                         }|j                  dd      }|j                  dd      }|j                  dd      }|j!                         }g }|D ]  }|j$                  r|j$                  j                  dg       ng }|s0t-        |d       }|j                  dd      }|r#||j                  dd      j+                         vru||k  r{|rP|j                  t.              j                  t.        j0                  |j                  k(        j                         }|r|j3                  |j                  |f        |j5                  d  d!       |d | D cg c]  }|d   	 }}|j                          |sd"dd#S t7        |      d$kD  rt#        dd%      d&t9        t;        j<                               d d'  }t?        |dt7        |       d(t7        |      g ||d)*       tA        |      }|tB        |<   dd+l"m#} tH        jK                  ||||       ||t7        |      |d,d-S # |j                          w xY w7 c c}w # |
j                          w xY wc c}w # |j                          w xY ww).Nr"  r  rs  z"A batch build is already running (r  r  
domain_idsr   filtersr   rL  r%  r  Fskip_existing_packagesr  z'Provide domain_ids, domains, or filtersr  r]  r  	min_valuer   	max_countr  skip_with_packagesTr  c                 &    | j                  dd      S Nviability_scorer   r  rR  s    r   r  z!api_batch_build.<locals>.<lambda>{	  s    7H!1L r   r   r.  r   c                     | d   S )Nr   r   r  s    r   r  z!api_batch_build.<locals>.<lambda>	  s
    ad r   r  z"No domains match the given filters)r   r     z#Maximum 200 domains per batch buildzbb-r  z	 packages)r&  r   r  )run_batch_build_orchestratorr  )r   rl  r  r   ru  )&r   r   r"   r   rm  ru  r  r   rl  r   r/  r   
setdefaultr   r  r<  r  r   r  r  r-  r  r  r    r  r  sortr   r   r  r  r  r   r  "app.services.batch_package_builderr3  r   r  )r   r  r  r+  r&  domain_namesr'  r   rL  r  _db_rrowsr^  db_fqniche_filterr)  r*  r+  domains_rawscoredr  r  bestr!  has_pkgr  r   r  r3  s                                 r   api_batch_buildrA  G	  sY    ~H~~c*11LLM)JJNNIy12
 %' 	 A,BUBUAV  WB  C  Xd  Xk  Xk  l  	D,+J88Ir*Lhhy"%GXXh#F hhy+.GHH_e4M
k7k#9:
.> J	;;vyy&--8??@Q@QR^@_`ddfD(,-1!$$-J-KKMg4]^^z~	

6"))&//*?*?*EFA";;w399;AACLK3IK4I!(-A4!H%%'KF  -9:"56'LM!2A6L8L8R8R8T$T9$%"jj1889L9LPQPXPX9XY__aG qttUm,-  KKNDK9(.z	(:;1!A$;J;JJL=JJ
:4YZZS&r*+,Hx3z?*;9(Es:XZ+5HJ x E#M(O4h
FS Z U 	" .KKMB <JJLs   S9BR- S9!#S9SB%S9+A,S
 S*S
 ,1S9G S$ S*S$ ,CS9-R??S9S
 
SS9S$ $S66S9z/api/batch/{batch_id}c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         S w)Nr  Batch not foundr  )r   r"   r   rl  r   r   r  )r   r   r  s      r   api_get_batchrD  	  sM     
((3-

szzX5
6
<
<
>C4EFF;;=   A#A%z/api/batch/{batch_id}/pausec                   K   t         j                  |       }|st               }	 |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  dv rt        dd|j                         	 |j                          t        dd      |j                  j                          | dd	S # |j                          w xY ww)
Nr  rC  r  r  r  r  r  zBatch already z-Batch orchestrator not active in this processr  r   r  )r  r   r   r   r"   r   rl  r   r   ru  r   r   rq  r   r  r   r  s       r   api_pause_batchrJ  	  s     h'E^	((3-&&szzX'=>DDFC#<MNNzz??#nSZZL<YZZ @ HHJ4cdd	 H55	 HHJs   "C1A:C  <C1C..C1z/api/batch/{batch_id}/resumec                   K   t         j                  |       }|r+|j                  r|j                  j	                          | ddS t               }	 |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  dk(  rt        dd      |j                  xs i }|j                  d	g       }|j                  d
d      }|D cg c]  }|d   dv s|d    }}|st        dd      t        |       }	|	t         | <   t        j!                  t"        | ||       | dt%        |      d|j'                          S c c}w # |j'                          w xY ww)NresumedrH  r  rC  r  r  r  zBatch already completedr   r=  r  ru  )r  r  r<  zNo domains left to process)r   r  	remaining)r  r   r   r   r   r   r   r"   r   rl  r   r   ru  r  r   r   r  r  r   r   )
r   r  r   r  r  domain_listr=  r  rM  	new_states
             r   api_resume_batchrP  	  sR    h'E$	::	Bhhsm""3::#9:@@BC8IJJ::$C8QRR!rjjB/jj3,7cb2h<Kb;bR\c	cC8TUUx(	"+h;XyR]^$	IW

 d 	
s8   AFB&E/ 6E*E*
AE/ F*E/ /FFz/api/batch/{batch_id}/stopc                   K   t         j                  |       }|r9|j                  j                          |j                  j                          | ddS t               }	 |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  dvrt        | dd       | dd|j                          S # |j                          w xY ww)	Nr  rH  r  rC  r  rG  zBatch stopped by user)ru  rv  )r  r   r   r   r   r   r   r"   r   rl  r   r   ru  r  r   rI  s       r   api_stop_batchrR  	  s     h'E$	::	Bhhsm""3::#9:@@BC8IJJ::??x	@WX$	:


s   AC6A2C! C6!C33C6r   r  ru  r[  c                   K   |j                  t              }| rX| dk(  r1|j                  t        j                  j	                  g d            }n"|j                  t        j                  | k(        }|r"|j                  t        j
                  |k(        }|r2|j                  t        j                  j                  d| d            }|j                  t        j                  j                               j                  t        |d            j                         }d|D cg c]  }|j                          c}iS c c}w w)Nr   rs  r  r  %r2  r  )r   r"   r   ru  r  rm  r<  iliker  r{  r  r[  r  r  r  )ru  rm  r<  r[  r   r;  r  r  s           r   api_list_jobsrW  	  s      	AX(HIJAv-.AHHS\\X-.HHSZZ%%&m45::cnn))+,223uc?CGGID$/QQYY[/00/s   D!E#D>:	Ez*/api/package/{pkg_id}/generate-calculatorsr  c                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  t              j                  t        j                  |j                  k(        j	                         }d }|rl|j                  r`|j                  j                  dg       D ]A  }|j                  dd      j                         |j                  j                         k(  s?|} n |j                  xs i }i }|j                  dg       }|j                  dd	      }	|rI|	t        |      k  r;||	   }
|
j                  d
d      |
j                  dd      |
j                  dd      d}d	dlm}  ||j                  ||      }||_        |j%                          dt        |j                  dg             dS w)Nr  r  r  r  r   r  r'  r(  r   r)  r*  r+  r,  r-  r.  r/  r5  r  r7  )ru  calculator_count)r   r    r   r  r   r   r   r<  r  r  r   r  rE  r[  r   re  r6  r3  r   )r  r   r  
domain_recr  rR  ry  rz  r{  r|  r}  r6  r  s                r   api_generate_calculatorsr[  	
  s    
((7

"
"7::#7
8
>
>
@C4GHH&!((#//)IJPPRJJj))$$((26 	AuuVR &&(C,<,<,B,B,DD
	
 bJL>>)R(D
..
*Cc$i9||OY?!&7Cll>9=
 K%c&6&6
LQFCOIIKFJJw4K0LMMs   D
G"CG"z0/api/package/{pkg_id}/generate-reference-libraryc                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  t              j                  t        j                  |j                  k(        j	                         }d }|rl|j                  r`|j                  j                  dg       D ]A  }|j                  dd      j                         |j                  j                         k(  s?|} n ddlm}  ||j                  |      }||_        |j!                          |r"|j                  d	i       j                  d
d      nd}d|t#        |j                  di             dS w)Nr  r  r  r  r   r  r   r9  r@  rA  r  r  )ru  r  r  )r   r    r   r  r   r   r   r<  r  r  r   r  rE  rf  r:  rG  r   r   )	r  r   r  rZ  r  rR  r:  r  r  s	            r   api_generate_reference_libraryr]  *
  s@    
((7

"
"7::#7
8
>
>
@C4GHH&!((#//)IJPPRJJj))$$((26 	AuuVR &&(C,<,<,B,B,DD
	
 O,S-=-=zJF"CIIKHN&**Z,00!DTUK;C

S]_aHbDcdds   D
FA:Fz!/api/package/{pkg_id}/calculatorsc                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |j                  d udS w)Nr  r  r  )r3  has_calculators)r   r    r   r  r   r   r3  r  r   r  s      r   api_get_calculatorsra  @
  s[     
((7

"
"7::#7
8
>
>
@C4GHH??sVZ?Z[[   A.A0z'/api/package/{pkg_id}/reference-libraryc                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |j                  d udS w)Nr  r  r  )rG  has_library)r   r    r   r  r   r   rG  r`  s      r   api_get_reference_libraryre  H
  s_     
((7

"
"7::#7
8
>
>
@C4GHH!$!6!6sG\G\dhGhiirb  z/api/domains/buildablec                   K   | j                  t              j                  t        j                  j	                  d             j                         }g }|D ]   }|j                  r|j                  j                  dg       ng }|s1t        |d       }| j                  t              j                  t        j                  |j                  k(        j                         }|j                  |j                  |j                  |j                  dd      |j                  dd      t        |      |d u|r|j                  nd |r|j                  nd d        |j!                  d	 d
       |t        |      dS w)Nr  c                 &    | j                  dd      S r-  r  r/  s    r   r  z'api_buildable_domains.<locals>.<lambda>X
  s    /@!)D r   r0  r   r  r.  r   )r  r<  
best_nicher.  r)  r  r  rH  c                     | d   S )Nr.  r   r  s    r   r  z'api_buildable_domains.<locals>.<lambda>d
  s    a 12 r   Tr  )r   r  )r   r   r   r  r  r  r   r  r    r  r<  r   r  r  r   rH  r5  )r   r   r  r  r  r?  r@  s          r   api_buildable_domainsrj  P
  s0    hhv%%foo&;&;D&ABFFHGF 12"-6DE((7#**7+>+>!((+JKQQS$$hh((62.#xx(91=v;"$.(/'**T297..t	
 		  KK2DKAF44s   E:E<z/mastermindc                 `  K   t        |      }|j                  t              j                  t        j                  j                               j                  d      j                         }|j                  t              j                  t        j                  j                  g d            j                  t        j                  j                               j                  d      j                         }|j                  t              j                  t        j                  j                  g d            j                  t        j                  j                               j                  d      j                         }|j                  t              j                  t        j                  j                  ddg            j                  t        j                  j                               j                  d      j                         }t        j!                  d	| ||D cg c]  }|j#                          c}|D cg c]  }|j#                          c}|D cg c]  }|j#                          c}|D cg c]  }|j#                          c}d
d      S c c}w c c}w c c}w c c}w w)Nr,  rT  r  rG  r\  r  r"  rh  mastermind.html
mastermindr   r_  listingsactive_jobsrecent_jobs
batch_jobsrz  )r  r   r6   r  r|  r  r[  r  r"   r   ru  r  r{  r  rm  r  r  r  )	r   r   r_  ro  rp  rq  rr  lr  s	            r   mastermind_pagert  j
  s    )"-Gxx*+445G5R5R5W5W5YZ``adeiikH((3-&&szz~~6V'WXaabebpbpbububwx~~  @B  C  G  G  IK((3-&&szz~~6X'YZccdgdtdtdydyd{|  C  C  DF  G  K  K  MK#%%cll&6&67W&XYbbcfcqcqcvcvcxy  AC  D  H  H  JJ%%&7*23QQYY[3-89		9-89		9,67qqyy{7$:   4997s6   H J."J9J.?JJ.J$3J.9J)J.z/_dev_admin/{token}/mastermindc                   K   | dk7  rt        dd      t        |      }|j                  t              j	                  t        j
                  j                               j                  d      j                         }|j                  t              j                  t        j                  j                  g d            j	                  t        j                  j                               j                  d      j                         }|j                  t              j                  t        j                  j                  g d            j	                  t        j                  j                               j                  d	      j                         }|j                  t              j                  t        j                  j                  d
dg            j	                  t        j                  j                               j                  d      j                         }t         j#                  d|||D cg c]  }|j%                          c}|D 	cg c]  }	|	j%                          c}	|D 	cg c]  }	|	j%                          c}	|D 	cg c]  }	|	j%                          c}	dd      S c c}w c c}	w c c}	w c c}	w w)Nr  r  r  r  r,  rT  r  rG  r\  r  r"  rh  rl  rm  rn  )r   r  r   r6   r  r|  r  r[  r  r"   r   ru  r  r{  r  rm  r  r  r  )
r  r   r   r_  ro  rp  rq  rr  rs  r  s
             r   dev_mastermind_pagerv  {
  s%    ((ODD)"-Gxx*+445G5R5R5W5W5YZ``adeiikH((3-&&szz~~6V'WXaabebpbpbububwx~~  @B  C  G  G  IK((3-&&szz~~6X'YZccdgdtdtdydyd{|  C  C  DF  G  K  K  MK#%%cll&6&67W&XYbbcfcqcqcvcvcxy  AC  D  H  H  JJ%%&7*23QQYY[3-89		9-89		9,67qqyy{7$:   4997s6   H2K 4J,K J1(K .J6K J;"K c                    ddl m} | j                  t              j	                         }t        |      }t        d |D              }| j                  t              j	                         }t        |      }t               }	 | j                  t              j                  t        j                  dk(        j	                         }|D 	ch c]  }	|	j                   }}	t        |      }
t        d |D              }t        d |D              }t        d |D              }t        d |D              }t        d	 |D              }t        d
 |D              }t        d |D              }d}d}|D ]W  }|j                  s	  ||j                  |j                        }||j                  dd      z  }||j                  dd      z  }Y | j                  t               j#                         }| j                  t$              j                  t$        j&                  dk(        j	                         }t        |      }t        d |D              }t        d |D              }i }|D ].  }|j                  |j(                  d      dz   ||j(                  <   0 | j                  t*              j                  t*        j                  j-                  g d            j#                         }i d|d|d|d|
d|d|d|d|d|d|d|d|dt/        |      d t/        |      d!|d"t/        |      d#|||t/        |t1        |d      z  d$z        t/        |t1        |d      z  d$z        t/        |
t1        |d      z  d$z        t/        |t1        |d      z  d$z        t/        |t1        |d      z  d$z        t/        |t1        |d      z  d$z        d%d&S c c}	w # t        $ r Y w xY w# t        $ r Y w xY w)'Nr   rV   c              3   :   K   | ]  }|j                   sd   ywr   N)r  r  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     414   r  c              3   :   K   | ]  }|j                   sd   ywry  )r(  r  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     ?1Q?rz  c              3   :   K   | ]  }|j                   sd   ywry  )rF  r  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     @!q/?/?A@rz  c              3   :   K   | ]  }|j                   sd   ywry  )r  r  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     Ca1??Crz  c              3   :   K   | ]  }|j                   sd   ywry  )r  r  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     F!q~~AFrz  c              3   :   K   | ]  }|j                   sd   ywry  )r[  r  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     81Q8rz  c              3   :   K   | ]  }|j                   sd   ywry  )r3  r  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     Damm1Drz  c              3   :   K   | ]  }|j                   sd   ywry  )rG  r  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     HqA4G4GHrz  r}  r~  r   c              3   <   K   | ]  }|j                   xs d   ywr   N)asking_pricer  rs  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     =qq~~**=   c              3   <   K   | ]  }|j                   xs d   ywr  )	bid_countr  s     r   r  z._compute_mastermind_summary.<locals>.<genexpr>
  s     8!Q[[%A%8r  r   rT  r  r  total_packagestotal_deployedr  	with_herowith_graphicswith_business_box
with_brandwith_calculatorswith_referencetotal_augmentsr  total_monthly_revenuetotal_listedtotal_asking_price
total_bidsr,  )r  r  r  r_  r3  r8  )platform_breakdownrp  completion_rates)app.services.valuationrW   r   r   r  r   r  r    r   r2   r   ru  r<  r   r  r   r$   r   r6   listing_statusplatformr"   r  r  r  )r   rW   r   r  r  all_packagesr  deployed_setdeploysr  r  r  r  r  r  r  r  r  total_valuetotal_monthlyr  r  r  ro  r  total_askingr  	platformsrs  active_jobs_counts                                 r   r  r  
  s   5hhv""$GLM4g44H88G$((*L&N5L((=)001E1E1TUYY[,34b		44 &N???J@|@@IC<CCMF|FF888JDlDDHLHHNKM ::$QXXqzz:sww'=qAA);Q!?? XXg&,,.Nxx*+223E3T3TX`3`aeegHx=L=H==L8x88JI A )ajj! <q @	!**A ,,SZZ^^<\-]^ddfH 	. 	.	
 	j 	Y 	 	. 	j 	, 	. 	. 	 {!3 	 }!5 	  	eL1!" 	j#$ ((h]A)>>DEns8Q/??#EFns>1/EEKL:NA(>>DE !1C4J!JS!PQ~NA0FFLM
) G 5 &  s8    AO OO <AO(O 	O%$O%(	O54O5z/api/mastermind/summaryc                     K   t        |       S wr  )r  )r   s    r   api_mastermind_summaryr  
  s     &r**s   z/api/mastermind/portfolio-gridc                 F  K   ddl m} | j                  t              j	                  t        j
                        j                         }i }| j                  t              j	                  t        j                  j                               j                         D ]   }|j                  |vs|||j                  <   " t               }	 | j                  t              j                  t        j                  dk(        j                         }|D ch c]  }|j
                   }}g }|D ]C  }	|j!                  |	j
                        }
i }d}d}|	j"                  rf	  ||	j
                  |	j"                        }|	j"                  j!                  dg       }|r*|d   j!                  dd      }|d   j!                  dd      }t%        |
xr |
j&                        }t%        |
xr |
j(                        }t%        |
xr |
j*                        }t%        |
xr |
j,                        }t%        |
xr |
j.                        }t%        |
xr |
j0                        }t%        |
xr |
j2                        }t%        |
xr |
j4                        }|	j
                  |v }t7        ||||||||g      }d}t9        ||z  d	z        }|j;                  i d
|	j
                  dt%        |	j"                        d|d|d|
r|
j<                  nd d|
r|
j>                  nd d|j!                  dd      d|j!                  dd      d|d|d|d|d|d|d|d|d||||
r|
j@                  nd d       F |tC        |      dS c c}w # t        $ r Y jw xY w# t        $ r Y 'w xY ww)Nr   rV   r  r  r  r   r!  r  r,  r<  r  r]  r  	pkg_nicher   r}  monthlyr~  r[  r]  rG  r_  calcsrefgfxbibr  )completenessasset_countquality_score)gridr  )"r  rW   r   r   r  r<  r  r    r{  r  r  r   r2   r   ru  r   r   r  r  r[  rC  rF  r(  r3  rG  r  r  r  r  r  r  rE  r  r   )r   rW   r   packages_by_domainr  r  r  r  r  r  best_pkgval_datar]  r!  r  r  has_copyr  r  	has_calcshas_refhas_gfxhas_bibr  r  total_assetsr  s                              r   api_portfolio_gridr  
  s    5hhv''6::<Gxx ))'*<*<*A*A*CDHHJ 6??"4425s/6 5L((=)001E1E1TUYY[,34b		44 D 2%))!((3::)!((AJJ? ZZ^^Hb1Fq	fb1q	gq14hnn5	7X%7%78<X%<%<=;h&;&;<	:h&:&:;	x>H$>$>?x:H$:$:;x9H$9$9:hh,.9h)YPWY`bijk[<7#=> 
ahh
QZZ(
 U
 U	

 Xhkk4
 (..
 X\\"8!<
 x||$6:
 Y
 H
 H
 Y
 Y
 7
 7
  7!
" #
$ )&7?X33T)
 	;2f 3t9--q 5   sh   B(N!+N!AN M<!N #5N!N6HN!<N 	N
N!NN!	NN!NN!z/api/mastermind/batch-resultsc                   K   | j                          d {   }|j                  dg       }|sdg iS g }|D ]  }|j                         j                         }|j	                  t
              j                  t
        j                  |k(        j                         }|r|j                  xs i ni }|j	                  t              j                  t        j                  |k(        j                  t        j                  j                               j                         }	|j                  d      xs |j                  d      xs g }
g }d }t        |
t               rz|
D ]m  }t        |t"              rA|j%                  |j                  d      xs |j                  d      xs t'        |             T|j%                  t'        |             o |r|d   }nt        |
t&              r|
}|j                  d      xs |j                  d	      xs i }d }d }t        |t"              rI|j                  d
      xs |j                  d      }|j                  d      xs |j                  d      }nt        |t(        t*        f      r|}|j%                  ||xs |	r|	j,                  nd |d d |||	d ut/        |	xr |	j0                        t/        |	xr |	j2                        |d ud	        d|iS 7 ֭w)Nr   rX  niche_opportunitiesr  r   r]  r   	valuationdomain_valuationestimated_valuer   monthly_revenuerevenue_potentialr   )	r<  r]  r  r  r  r  has_site_copyhas_sales_letterr  )r/  r   r-  r  r   r   r   r<  r   r  r    r  r  r{  r  r1  rl  rP  r  r   r:  rB  rE  r  rC  r(  )r   r   r+  r7  rX  dndn_clean
domain_objr  r  
niches_rawr  rE  rR  r  	est_valuemonthly_revs                    r   api_mastermind_batch_resultsr  '  s    D88Ir*L2G (88:##%XXf%,,V]]h-FGMMO
2<J''-2"hhw&&w':':h'FGPPQXQcQcQhQhQjkqqs\\"78XHLL<RXVX
j$' *a&MM!%%-"K155>"KSVLMM#a&)	*
 %ay
C(%LLL-W>P1QWUW		i&!&78RIMM'<RI#--(9:`immL_>`K	C<0!I!H#c&6&64Raj(*d?!#"7#--8 $S%=S-=-= >"$.

 
	=(T wa  s   K/K,KK/z/api/marketplace-listingsr  c                 
  K   |j                  t              }| r2|j                  t        j                  j	                  d|  d            }|r"|j                  t        j
                  |k(        }|r"|j                  t        j                  |k(        }|j                  t        j                  j                               j                  d      j                         }d|D cg c]  }|j                          c}iS c c}w w)NrU  r2  ro  )r   r6   r   r<  rV  r  r  r  r|  r  r[  r  r  )r<  r  ru  r   r;  ro  rs  s          r   api_list_marketplacer  ^  s      	#$AHH'..44q]CDHH'00H<=HH'66&@Azz,77<<>?EEcJNNPHh77887s   C!D#C>:	Dc                 v  K   | j                          d {   }|j                  dd      xs dj                         j                         }|j                  dd      xs dj                         j                         }|r|st	        dd      t        |||j                  dd      |j                  dd	      |j                  d
      |j                  d      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d            }|j                  d      r8	 t        j                  j                  |d   j                  dd            |_	        |j                  d      r8	 t        j                  j                  |d   j                  dd            |_        |j                  |       |j                          |j                  |       |j                         S 7 # t        $ r Y w xY w# t        $ r Y _w xY ww)Nr<  r  r  r  zdomain and platform requiredr  listing_urlr  r   r  current_bidr  r   viewswatcherssourcemanualnotes
extra_data)r<  r  r  r  r  r  r  r  r  r  r  r  	listed_atrW  z+00:00
expires_at)r/  r   r-  r  r   r6   r  r  ra  r  r   r  r   r   r  r  )r   r   r+  r<  r  listings         r   api_create_marketplace_listingr  l  s    Dhhx$*11399;FR(.B557==?H4RSS HH]B/xx 0(;XXn-HH]+((;*hhw"*a(xx(+hhw#88L)G xx	 ( 1 1 ? ?[@Q@Y@YZ]_g@h iG xx	!)!2!2!@!@lASA[A[\_aiAj!kG FF7OIIKJJw??E  .  		
  		sY   H9HD>H97H H97H* AH9	H'$H9&H''H9*	H63H95H66H9z&/api/marketplace-listings/{listing_id}
listing_idc                 |  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                          d {   }dD ]  }||v st        ||||           |j                          |j                  |       |j                         S 7 Qw)Nr  Listing not foundr  )r  r  r  r  r  r  r  r  r  r  r  )r   r6   r   r  r   r   r/  setattrr   r  r  )r  r   r   r  r+  fields         r   api_update_marketplace_listingr    s     hh)*112D2G2G:2UV\\^G4GHHDT 1D=GUDK01 IIKJJw??  s   A&B<(B:)B<7AB<c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          ddiS w)Nr  r  r  rg  T)r   r6   r   r  r   r   r  r   )r  r   r  s      r   api_delete_marketplace_listingr    sf     hh)*112D2G2G:2UV\\^G4GHHIIgIIKt   A8A:z$/api/marketplace-listings/import-csvc                   K   dd l }dd l}| j                          d {   }|j                  dd      }|st	        dd       |j
                   |j                  |            }d}g }t        |      D ]  \  }	}
	 |
j                  dd      xs dj                         j                         }|
j                  dd      xs dj                         j                         xs d	}|s|j                  d
|	dz    d       t        |||
j                  dd      xs |
j                  dd      |
j                  dd      |
j                  d      rt        |
d         nd |
j                  d      rt        |
d         nd t        |
j                  dd      xs d      t        |
j                  dd      xs d      t        |
j                  dd      xs d      d|
j                  dd            }|j                  |       |dz  } |j#                          ||dS 7 # t        $ r.}|j                  d
|	dz    dt!        |              Y d }~d }~ww xY ww)Nr   csvr  r  zcsv field requiredr  r<  r  r  zRow r   z: missing domainr  r   ru  r   r  r  r  r  r  
csv_importr  )r<  r  r  r  r  r  r  r  r  r  r  r}  )importederrors)r  ior/  r   r   
DictReaderStringIO	enumerater-  r  r  r6   rB  r:  r   r   r   r   )r   r   r  r  r+  csv_textreaderr  r  ir  r<  r  r  r   s                  r   api_import_marketplace_csvr    s"    Dxxr"H4HIIS^^KBKK12FHFF# 23	2ggh+1r88:@@BF
B/52<<>DDFR(HQqSE)9:;(!GGM26L#''%:L"wwx:;>77>;RU3~#67X\9<9OE#m"45UYcggk15:;#'''1-23SWWZ38q9#gggr*G FF7OMH+20 IIK F33C  <  	2MMD1RAx011	2sH   IHAI=BH ?I DH I 	I)#IIIIz/api/export/{domain}/bundlec                 L  K   dd l }dd l}dd l}| j                         j	                         } |j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd       |j                         }| j                  dd      } |j                   |d|j"                        5 }|j$                  xs i }	|	j'                  dg       }
|	j'                  d	d      }|
rt)        |
      |kD  r|
|   ni }|	j'                  d
|j'                  d|             |d
<   |	j'                  d|j'                  dd            |d<   d|d
    d}|d|d    dz  }|d|  dz  }|d|j*                   dz  }|j'                  d      r|d|d    dz  }|j'                  d      r|d|d    dz  }|j'                  d      r|d|d    dz  }|j'                  d      r|d|d    dz  }|j'                  d      r|d|d    dz  }|j'                  d      r|d|d    dz  }|j-                  | d |       |j-                  | d!|j/                  |	d"t0        #             |j2                  rWd$|  d}|j2                  j'                  d%g       }|rt5        |t6              r|D ]  }|j'                  d&d'      }|d(|j                  dd)      j9                          dz  }|j;                         D ]  \  }}|d&k(  rt5        |t0              r|d*| d+| dz  })t5        |t6              s:|d*| d,z  }|D ]:  }t5        |t<              r|d-|j/                  |t0        .       dz  }2|d-| dz  }< |dz  }  |j-                  | d/|       |j-                  | d0|j/                  |j2                  d"t0        #             |j>                  r%|j-                  | d1d2|  d|j>                          |j@                  rd }|j@                  jC                  d3      r7tD        jF                  jI                  d4|j@                  t)        d3      d        }n'|j@                  jC                  d5      r|j@                  }|r\tD        jF                  jK                  |      r=tD        jF                  jM                  |      d6   xs d7}|jO                  || d8|        |jP                  rdd9l)m*}  ||jP                        D ]  }|j'                  d:d      }|sd }|jC                  d3      r-tD        jF                  jI                  d4|t)        d3      d        }n|jC                  d5      r|}|sntD        jF                  jK                  |      stD        jF                  jW                  |      }|jO                  || d;|         |jX                  r|jX                  }|j'                  d<i       }|s|j'                  d=i       }|ryt5        |t<              rii }|j;                         D ]R  \  }} t5        | t<              s| j;                         D ])  \  }!}"t5        |"t<              r|"nt1        |"      ||!d>||!<   + T |}t5        |t<              r|j;                         ng D ]  \  }#}$t5        |$t<              r|$j'                  d?d      }%|$j'                  d@|#j                  dd)      j9                               }&|$j'                  dAdB      }'|'j                  d)d      j                  dCd      }(|%sdD|& d})|)dE|' dz  })|)d|  dz  })|$j'                  dF      r|)dG|$dF    dz  })|)dHz  })|j-                  | dI|( dC|# dJ|)|%z          t5        |$t0              s|$s|j-                  | dK|# dJ|$        |jZ                  r5|j-                  | dL|j/                  |jZ                  d"t0        #             |j\                  r5|j-                  | dM|j/                  |j\                  d"t0        #             d}*	 |j                  t^              j                  t^        j`                  | k(        j                         }+|+r|j                  tb              j                  tb        jd                  |+jf                  k(        ji                         },|,D ]v  }|jj                  jm                  dC      }-tD        jF                  jK                  |-      s>|jn                  xs dN}.|jO                  |-| dO|. dC|jp                          |*d6z  }*x d}/	 |j                  tt              j                  tt        j                  | k(        j                  tt        j                        ji                         }0|0D ]t  }1|1jv                  sty        | |
rt)        |
      |kD  r|
|   n| ddP|	|1|0Q      }2t{        |1jf                  |1j8                        }3|j-                  | dR|3 dS|2       |/d6z  }/v 	 d }4	 |
rt)        |
      |kD  r|
|   n| ddP}5t}        | |5|	|j2                  xs i |j@                  dTt               v r0ng U      }4|j-                  | dV|4       |jX                  xs i j'                  d<i       }6t5        |6t<              rt)        |6      nd}7i }8t5        |6t<              r|6j;                         ng D ]Y  \  }9}:t5        |:t<              s|:j'                  dAdB      };|8j                  |;g       j                  |:j'                  d@|9             [ t)        |j2                  xs i       }<d}=|jP                  r"	 dd9l)m*}> t)         |>|jP                              }=dD|d
    dW}?|?d|  dz  }?|?d|j*                   dz  }?|?dG|j                  r|j                  j                  dX      ndY dz  }?|?dZz  }?|?d[z  }?|?| d\z  }?|?d]z  }?|?d^|< d_z  }?|?d`t)        |j>                  xs d       daz  }?|?dbz  }?|?dc|= ddz  }?|?de|7 dfz  }?|?dg|* dhz  }?|?di|/ djz  }?|?dkz  }?|?dlz  }?|8rn|?dmz  }?t        |8j;                               D ]M  \  }}@|?dn|j                  dd)      j9                          dot)        |@       dpz  }?|@D ]  }A|?d-|A dz  }? |?dz  }?O |?dqz  }?|j-                  | dr|?       d d d        |j                  d       ddslEmF}B  |B|dtdudv| dwix      S # tr        $ r Y w xY w# tr        $ r Y w xY w# tr        $ r Y w xY w# tr        $ r Y w xY w# 1 sw Y   qxY ww)yNr   r  r  r  r  r
  wr'  r  r  r   r  r  z# Brand Identity: 

z**Tagline:** z**Domain:** z**Niche:** r)  z**Primary Color:** r  r+  z**Secondary Color:** fontz
**Font:** rP  z
**Tone:** personalityz
## Brand Personality
value_propositionz
## Value Proposition
z$/01_brand_identity/brand_identity.mdz"/01_brand_identity/brand_data.jsonrR  indentr   z# Site Copy: r  r
  sectionz
## r  z**z:** z:**
z- r   z/02_site_copy/site_copy.mdz/02_site_copy/site_copy.jsonz /03_sales_letter/sales_letter.mdz# Sales Letter: r   r   static/r   .pngz/05_graphics/heror   r   z/05_graphics/r  r  )r  r  r   r  r   r  r	  r  z# z
**Tier:** generated_atz**Generated:** z
---

z/06_business_docs/.mdz/06_business_docs/general/z/04_config/atmosphere.jsonz!/04_config/discovery_answers.jsonr  z/07_brand_kit/r  )all_augmentsz/08_augments/r  r  )r  z/09_site/index.htmlu    — Business Package

z%Y-%m-%dN/Az## Package Contents

z```
z/
uC   ├── 01_brand_identity/    # Brand colors, fonts, personality
u"   ├── 02_site_copy/         # z website content keys
u<   ├── 03_sales_letter/      # Marketplace sales letter (z chars)
u;   ├── 04_config/            # Theme & discovery config
u"   ├── 05_graphics/          # z graphics + hero image
u"   ├── 06_business_docs/     # z Force Multiplier documents
u"   ├── 07_brand_kit/         # z brand kit assets
u"   ├── 08_augments/          # z interactive tools
u;   └── 09_site/              # Complete standalone site
z```

z## Business Documents by Tier

z### r  z)
u<   ---

Generated by **Aura** — Domain to Business Generator
z
/README.mdr   application/zipContent-Dispositionattachment; filename="z_business_package.zip"
media_typer  )Gzipfiler  r/  r-  r  r   r    r   r  r  r{  r  r   r   BytesIOra  ZipFileZIP_DEFLATEDr[  r   r   rE  writestrr  r   rC  r1  rl  r   rk  rP  r(  rF  r   r   r   rb  isfilesplitextrd  r  r  r  r  r  rV  rM  r&   r<  r'   rg  r  r  r3  r5  ri  r  r   r$   r   generate_standalone_augment_htmlr  generate_standalone_site_htmldirr4  r  strftimer  seekr  r   )Cr<  r   r  r  json_moduler  bufsafezfr[  r  r  r  brand_mdsite_mdr  ri  sec_typekr8  item	hero_pathextr  r  r   r3  fnamebball_docsflat	tier_namer  r#  r$  doc_keydoc_datar  r   r  	safe_tierheaderbk_countrq  r  	disk_pathr@  	aug_countr  r"  aug_htmlr   	site_htmlchosenbb_docsbb_countbb_tiers_list_dk_dv_tsite_copy_keys	gfx_count_fpareadme
doc_titlesdtr   sC                                                                      r   api_export_business_bundler7    sS    \\^!!#F
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHH
"**,C>>#s#D	c7#7#7	8 1B		RYYy"-
))-q1,63z?W;TZ(Z\
#(99\:>>&RX;Y#Z
<  %		)Z^^Ir5R S
9'
<(@'AFmJy$9#:$??l6($//k#"2"2!3488>>/*-j.I-J"MMH>>+,/
;L0M/NbQQH>>&!*Z%7$8;;H>>&!*Z%7$8;;H>>-(2:m3L2MRPPH>>-.2:>Q3R2SSUVVH
tf@A8L
tf>?ARARSXabloARApq==%fXT2G}}((R8HJx6# ,C"wwvy9Hx'7'7S'A'G'G'I&J$OOG #		 ,1;$%a-#A3d1#T'::G'40#A3e}4G() =#-dD#9$+K4E4EdTW4E4X3YY[/\$\G$+D6}$<G	=
 $tOG,,  KK4& :;WEKK4& <={?P?PQTQ^Q^ghru?P?vwKK4& @AEUV\U]]abebrbrasCtuI!!,,Z8GGLL33E3Ec*oFV3WX	##..y9..	RWW^^I6gg&&y1!4>tf,=cU$CDA,S->->? Giir* 	>>*- "Xs3z?;K7L MI^^I. #I	!:GG,,Y7EHHY4&eW(EFG !!Bvvk2.H66'2.
8T :D080@ @,	9%i6*3//*; @B1;B1E2WZ[]W^hq|~KR@@  $H:DXt:Thnn&6Z\ [!h-&ll9b9G$LL'//#s2K2Q2Q2STE#<<	:D $S# 6 > >sC HI#%eWD!1JtfB"77L";;#<<7"8P7QQS&TTFI.tf,>yk7)SV$WY_biYij#.8KK4&(B7)3 OQYZ[" >>KK4& :;[=N=Ns~~fgqt=N=uv  KK4& ABKDUDUVYVkVktu  @CDU  ED  E	((8$++HOOv,EFLLNCHH]3::=;U;UY\Y_Y_;_`ddf	& &E % 6 6s ;Iww~~i0#22EotfN3%qHX,YZ A& 			xx(//0C0Cv0MNWWX_XjXjkooqH ###?_inqr|n}  AH  oH
SZH[  W]  jl  Nm  ot  vy  HP   QH(;DKK4&dV5 A8LNI# 		,63z?W;TZ(civxZyF5ffeS]]M`^`bebtbt  LV  Z]  Z_  L_  @H  eg  hIKK4& 34i@ ##)r..{B?#-gt#<3w<!,6w,E2 	OHC#t$WWVY/((R0778MN	O
 S]]0b1	MS%6%6 78	 j.//HIL++K 0 0144O3>>CNN$;$;J$G_d#eeijj++'TF#,XY6~6FF]^^PQTUXUeUeUkikQlPmmvwwPQ6ykAYZZ6xj@]^^6xj@STT6ykAUVVPQ)99F)/0C0C0E)F %	:D!2!23!<!B!B!D ERJGXX[\\$ *B2$bk)F*$	 	SS
tfJ'01B HHQK5$&*@F\(]^ O  		  		  		"  C1 1s   C)v$+I=v)Iv,vB1v>C1v0A)vvBv=Cu;u
vA1u(?A'u(&v*A&u8A7vA,v5!vEv(0v$	u%!v$u%%v(	u51v4u55v8	vvvv	vvvvv!v$z/api/build-packagec                   K   | j                   j                         j                         }| j                  j                         }|r|st	        dd      |j                  t              j                  t        j                   |k(        j                         }|r|j                  st	        dd      t        t        j                               d d }| j                  xs d}| j                  xs d}| j                  xs d	}| j                   }	| j"                  }
| j$                  }|
s1|r#|d
k7  r|j                  t&              j                  t&        j(                  |k(        j                         }|r|j*                  rddlm} |dv r|nd} ||j*                  |      \  }}||j*                  j1                  di       j1                  |i       j1                  d|j3                               |||j*                  j1                  di       j1                  dd      ddddd|j*                  j1                  di       d}
nt5        d      }
nt5        d      }
||||||	|
|xs d
d}t7        |d|t9        t:              dz
  t:        |       t<        j?                  t@        |||||	|||
|xs d

       ||||ddS w) Nr  z"Domain and niche name are requiredr  r  $Domain not found or not analyzed yetr  rG  rI  rK  r   r   )r\   )minimalr&  comprehensiver%  r;  depth_presetsrS  prompt_overridesglobal_toner  zbusiness-casualhighT)rP  	formalitytarget_word_countinclude_cta_in_every_sectionseo_optimizedvisual_defaults)r  depth_labelcontent_multiplierr  global_settingsvisual_settingsr<  rF  rH  rJ  rL  rM  rN  rO  buildr   r  r  )rl  r<  r]  rH  ru  )!r<  r-  r  rF  r   r   r   r   r   r  r   r  r  rH  rJ  rL  rM  rN  rO  r(   r   r   app.services.profilesr\   r   r   rJ   r  r   r  r   r  r  )r  r   r  rF  ro  rl  rH  rJ  rL  rM  rN  rO  profiler\   r  r  
multiplierrp  s                     r   api_build_packagerN    s    **""$**,K%%'Jj4XYYHHV$++FMM[,HIOOQM 6 64Z[[r"F%%/M##6Lkk'ZG--I##LLI5hh{+22;3C3C|3STZZ\G7>>J#*.c#cix'?PU'V$*"#*>>#5#5or#J#N#NuVX#Y#]#]^eglgrgrgt#u*4 ( ' 2 23Er J N N}^l m%6-38<)-( (/~~'9'9:KR'P	 2/B	-o>I  &$.$1		L vwS-=-A;]ijv{J<)\=VY
 j[ht}~~s   J<J>Fr]  rg  forcec                    t               }	 t        | dddt        t              dz
  d       |j	                  t
              j                  t
        j                  |k(        j                         }|s t        | dd	       	 |j                          y |j	                  t              j                  t        j                  |k(        j                         }|D cg c]  }|j                  d
k(  s| }	}|D cg c]  }|j                  dk(  s| }
}|s|	D cg c]  }|j                  | }}|
D cg c]  }|j                  | }}t        |	      t        |      z
  }t        |
      t        |      z
  }|dkD  s|dkD  r!t        j!                  d| d| d       n|	}|
}t        | dt        |       ddd       g }|	D ]6  }	 t#        |j$                  |j&                        }|r|j)                  |       8 dj/                  |      }||_        |j3                          t5        |      xs |}t        | |rdnddd       |j6                  xs i }dd l}|rl|j;                         r\	 t=        |||      }t?        |t@              rtC        jD                  |      }|}|D ]!  }|j8                  jG                         |_        # nZ|rX|j;                         sH|D ]!  }|j8                  jG                         |_        # t        j!                  dt        |       d       ||_        |j3                          t        | dt        |       dt        |      t        |
      k  rd t        |
      t        |      z
   d!nd"z   d#d$       g }|
D ]  }|j                  |r|j)                  |j&                  |j$                  |j                  |jH                  xs d%|jJ                  xs g |jL                  xs d"|jN                  xs g d&        |}tQ        |      D ]D  \  }}	 t        | d'|dz    d(t        |       d|j&                   d)*       tS        |j$                  |j&                  ||      }|jU                  d+d%      |_$        |jU                  d,g       |_%        |jU                  d-d"      |_&        |jU                  d.g       |_'        tW        jT                  |jH                  g       |_,        |j8                  jG                         |_        |j3                          |j&                  |d/<   |j$                  |d0<   |j                  |d1<   |j)                  |       G ||_-        |j3                          t        | d5d6d7       	 t]        |||      }||_/        t        j!                  d8|        	 ta        ||      }||_1        t        j!                  d?| d|jU                  d@dA       dB|jU                  dCd       dD       	 te        |      }||_3        |D ]s  }|jU                  d1      } | s|j	                  t              j                  t        j                  | k(        j                         }!|!s]|jU                  d.g       |!_'        u t        j!                  dH| dt        |       dI       dK|_4        |j3                          t        | dLdMt        t              dz
  dNO       |j                          y c c}w c c}w c c}w c c}w # t*        $ r0}t        j-                  d|j&                   d|        Y d }~d }~ww xY w# t*        $ rV}t        j-                  d|        dtA        |      i}|D ]!  }|j8                  jG                         |_        # Y d }~d }~ww xY w# t*        $ rS}t        j-                  d2|j&                   d|        |j)                  |j&                  d%d3| g d4       Y d }~d }~ww xY w# t*        $ rI}t        j-                  d9| d|        d:g g d;d<t        |	      t        |
      d=d>|_/        Y d }~d }~ww xY w# t*        $ r9}t        j-                  dE| d|        ddAdFg g g g g g dddG|_1        Y d }~d }~ww xY w# t*        $ r-}t        j-                  dJ| d|        g |_3        Y d }~$d }~ww xY w# t*        $ r}t        jk                  dP|        	 |j	                  t
              j                  t
        j                  |k(        j                         }|r'd|_4        tA        |      |_6        |j3                          n#  Y nxY wt        | dtA        |      dQtA        |      d dR  S       Y d }~d }~ww xY w# |j                          w xY w)TNr  zProcessing brand kit...r   r   rQ  r  r  zBrand kit not foundru  r   rI  r`  z	Skipping z doc(s) and z9 image(s) already classified (use force=True to override)zExtracting text from z document(s)...rc  r4  zFailed to extract text from r}  z

---

z%AI is analyzing your brand content...z)Documents already classified, skipping...rR  re  zDoc classification failed: r   zMarking z0 doc(s) as classified (empty/unreadable content)zClassifying z image(s)...z
 (skipped z already done)r  r!  rf  rI  )r  r3  rH  ri  rL  r   suggested_sectionszClassifying image r  r  r<  ri  rL  r   rR  r  r3  rH  z Image classification failed for zClassification failed: )r  ri  r   rL  zBuilding brand intelligence...r   rg  z Brand kit summary generated for zBrand kit summary failed for zAnalysis unavailablezSummary generation failedunknown)r  r"  )rP  rU  visual_motifsbrand_personalitycontent_strengthr  zGap analysis computed for grader  r  completeness_pctz%)zGap analysis failed for Error)rX  rW  grade_labelmissing_requiredpresent_requiredmissing_recommendedpresent_recommendedmissing_nice_to_havepresent_nice_to_havetotal_itemspresent_countzImage suggestions computed for z suggestionszImage suggestions failed for r  r  zBrand kit ready!rY  r  zBrand kit processing failed: r  r2  ru  r   rv  )7r   r  r   BRANDKIT_STEPSr   r&   r   r  r   r   r'   rg  r  rh  classified_atr   r   r^   r3  r  r  r   r   rb  raw_textr   r  r`  r  r-  r_   r1  r   r/  r0  r  ri  rL  rK  rR  r  r`   r   ri   rj  r_  rf   r_  rg   gap_analysisrh   image_suggestionsru  	exceptionprocessing_error)"rl  r  r]  rg  rO  r   rq  assetsr  
doc_assets
img_assetsunclassified_docsunclassified_imgsskipped_docsskipped_imgsall_textdocr   r   rf  needs_doc_classifyr`  _dtr  r_  imgclassify_listr  r_  gapimg_suggestions
suggestionrH  r  s"                                     r   run_brandkit_jobr{    s	   	Bc6):S#$#n2E2I$*	, hhx ''|(CDJJLvh6KLv 	
s -(//0J0Jl0Z[__a!'FA1<<:+EaF
F!'CA1<<7+BaC
C,6 Rq!//:Q R R,6 Rq!//:Q R Rz?S1B-CCLz?S1B-CCLa<!#3i~\,  PI  J  K * *6*?DU@V?WWf(g#$y	B  	QCQ-cmmS\\JOOD)		Q !%%h/
		!"34=6Se(O  lW#$	H MM'R	(.."2>28[%Pfc*!ZZ/F"	, >C(+(;(;(=C%>  (8( :$'LL$7$7$9!:KK(3'8#9"::jkl!
		6,s;L7M6Nl([  il  m~  i  BE  FP  BQ  iQaklopzl{  B  CT  U  mU  lV  Vd  `e  WY  )Z#$7H	J !# 	C  ,U%,, #3== ##:L:L:WPWHHN3;M;M;SQS*-*@*@*FB	.  	 *. 	FAs62DQqSE3}K]J^^`adamam`nnq0rs's||[RWX%+ZZ0@'%J"!::fb1%+ZZr%B")/4H")M&'A'E'EcFXFXZ\']$$'LL$7$7$9!		%(\\z"&)mm{#%(VVz"%,,V4	. %:!
		6(H#$~	G	{,Y8M{[G!CKKK:;-HI
	a&y&9C"CKK4[MCGGGUXDYCZZ\]`]d]dewyz]{\||~  A
	'7?O$3C!- \
%>>*5HH]3::=;K;Kx;WX^^`E3=>>BVXZ3[0\ KK9+b_I]H^^jkl
 

		6+ 2#&~#6#:$.	0$ 	
q GC !S R$  Q;CLL>A3OPPQ*  >:1#>?$c!f-	, >C(+(;(;(=C%>>X  ?~RPQsST%,, #%<QC#@".  "  	{LL8RsKL#9r\^  vQ  gp  OR  S]  O^  jm  nx  jy  Az  {CKK	{  	aLL3K=1#FG45T[qs  JL  eg  @B  \^  xz  KL  _`   aC	a  	'LL8RsKL$&C!!	'  :8<=	((8$++HKK<,GHNNPC%
'*1v$			6(#a&")#a&#, 8	: 	:: 	
s  A4c, Ac, \.\2c, 8\\c, \+\/c, 5\\A>c, 
3\=A2c, 0A] 
Cc, !c, $Bc, *D=^:')c, ,` >Aa. *b3 <Ab3 >b3  7c, c, 	]%%]
c, ]c, 	^7!A^2,c, 2^77c, :	`A`c, `c, 	a+">a& c, &a++c, .	b07.b+%c, +b00c, 3	c)<"c$c, $c))c, ,	f45f/A,e;:f/;e?=,f/)f7 /f44f7 7g	z/api/brandkit/{domain}/upload.filesc           
      $	  K   | j                         j                         } |st        dd      |j                  t              j                  t        j                  | k(        j                         }|rd|_        nt	        | d      }|j                  |       |j                          t        j                  j                  ddd| j                  d	d
            }t        j                  |d       dddd}d}d}t!        |      |kD  rt        dd| d      dd l}	g }
|D ]  }t        j                  j%                  |j&                  xs d      d   j                         }|t(        v rd}n|t*        v rd}n|dxx   dz  cc<   f|j-                          d {   }t!        |      |kD  r|dxx   dz  cc<   t!        |      dk(  r|dxx   dz  cc<    |	j.                  |      j1                         }|j                  t2              j                  t2        j4                  |j6                  k(  t2        j8                  |k(        j                         }|r.|dxx   dz  cc<   |
j;                  |j&                  xs d       et        j                  j=                  |j&                  xs d      }dd l}|jA                  dd
|      }|r|jC                  d	      rd|d   |d   z    | }t        j                  j                  ||      }t        j                  jE                  |      rt        j                  j%                  |      \  }}d}t        j                  jE                  |      rN| d
| | }t        j                  j                  ||      }|dz  }t        j                  jE                  |      rNtG        |d      5 }|jI                  |       d d d        |dk(  r|dxx   dz  cc<   n|dxx   dz  cc<   t3        |j6                  |||t!        |      |      }|j                  |        d |_        |jK                          |j6                  | |d d!}|
r|
|d"<   t!        |
       d#|d$<   |S 7 # 1 sw Y   xY ww)%Nr  zNo files uploadedr  	uploading)r<  ru  r   uploadsbrandkitr  r
  Tr   r   )docsr"  r  i  r   zToo many files. Maximum z files per upload.r  r   rI  r`  r  rS  upload[^a-zA-Z0-9._-]upload_r  r"  r#  )rg  rh  r  r3  	file_size	file_hashuploaded)rg  r<  r  ru  duplicates_skippeduA    file(s) already in your Brand Kit — skipped to save AI creditsduplicate_message)&r-  r  r   r   r&   r   r<  r   ru  r   flushr   r   rb  ra  r   r   hashlibr  r  rc   rb   readsha256	hexdigestr'   rg  r  r  r  r  r`  ra  r   r4  rc  rd  r   )r<  r|  r]  r   rq  
upload_dirsaved_countMAX_FILE_SIZEMAX_TOTAL_FILESr  
duplicatesfiler  rh  r  r  r   	base_name_re	safe_namer3  rE  ext_partcounterr  r  r  s                              r   api_upload_brandkitr    s     \\^!!#F4GHH
((8

#
#HOOv$=
>
D
D
FC
 
f[9
sHHJh	:v~~cSV?WXJKK
T*a8K$MO
5zO#6NN__q4rssJ ;ggt}}23A6<<>. #J$$ J	"a'"		#w<-'	"a'"w<1	"a'""GNN7+557	88M*11&&#&&0##y0
 %' 	 	"a'"dmm8y9GG$$T]]%>h?	GG.Y?	I005!+f"5H8M"M!NseTIGGLLY7	77>>)$"$''"2"29"=IxG''..+(k7)H:>	GGLLY?	1 ''..+
 )T" 	aGGG	 #1$!Q&!!'l
 	uw;z CJIIK 	F '1#$),Z(99z&{"#M $B	 	s2   FRRH!RRRB#RR		Rz/api/brandkit/{domain}/processc                   K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|st        dd      t        t        j                               d d }t        |d| t        t              dz
  t               d|_        |j                          t         j#                  t$        || ||j&                  |       || |j&                  d|dS w)	Nr  z'No brand kit found. Upload files first.r  r  r  r   
processing)rl  r<  rg  ru  force_reprocess)r-  r  r   r&   r   r<  r   r   r   r  r  r  r   rd  ru  r   r   r  r{  r  )r<  r]  rO  r   rq  rl  s         r   api_process_brandkitr    s     \\^!!#F
((8

#
#HOOv$=
>
D
D
FC4]^^r"Fvz63~+>+BNSCJIIK(&&%OR^sxyys   DDz/api/brandkit/{domain}c                   K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|sd| dS |j                  t              j	                  t        j                  |j                  k(        j                         }|j                  xs i }i }|j                         D ]1  \  }}t        |t              s|d d t        |      dkD  rdndz   ||<   3 i }|j                  xs i }	|	j                         D ]V  \  }
}|
j!                  d      s|
dk(  r| t        |t              r	|d d ||
<   9t        |t"              r	|d d	 ||
<   R|||
<   X d
| |j$                  |j                  |||j&                  |j(                  |j*                  |j,                  |j.                  r|j.                  j1                         nd |D cg c]n  }i d|j                  d|j2                  d|j4                  d|j6                  j!                  d      sd|j6                  z   n|j6                  d|j8                  d|j:                  dt=        j>                  |j:                  |j:                  xs d      d|j@                  xs g d|jB                  d|jD                  xs dd|jF                  xs g d|jH                  xs g d|jJ                  dtM        |dd      xs dd|jN                  r|jN                  j1                         nd d|j.                  r|j.                  j1                         nd q c}tQ        |      dS c c}w w)NF)r4  r<  ,  r  r  r
  r   r1  r\  Tr  r
  r  file_urlr  r  ri  classification_labelrL  rK  
sort_orderr   rR  rj  r  is_default_logore  r{  )r4  r<  ru  rg  r`  extracted_previewsr_  r_  rg  rh  r{  rk  rY  ))r-  r  r   r&   r   r<  r   r'   rg  r  r  r`  rk  r1  r   r   r   rl  ru  r_  r_  rg  rh  r{  r  rh  r  r3  r  ri  rd   r   rL  rK  r  rR  rj  r  r  re  rk   )r<  r   rq  rk  extracted_textsdoc_previewsr  r   extracted_cleanraw_extractedr  r8  r  s                r   api_get_brandkitr    sv    \\^!!#F
((8

#
#HOOv$=
>
D
D
FC622XXm$++M,F,F#&&,PQUUWFmm)rOL&,,. RtdC "&t*TSb"QLR OMM'RM##% 
#1<<W9a!"5DOA4 !"3BOA!"OA
# **$*!$!:!:;;(( 2247NNcnn..0$ #" #
!$$
ALL
 


 1G1G1Lakk)RSR]R]	

 
 a..
 #$9$=$=a>N>NPQP`P`Pfdf$g
 AFFLb
 a..
 !,,+!
 !!"6"6"<"
  2 2 8b
 
 wq*;UCLu
 AOOQ__668QU
  all!,,002!
 $ 6f== s   C.N1D	N:E4M=.Nz'/api/brandkit/{domain}/asset/{asset_id}rH  c                   K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|st        dd      |j                  t              j	                  t        j                  |k(  t        j                  |j                  k(        j                         }|st        dd      t        j                  j                  |j                        r 	 t        j                  |j                         |j#                  |       |j%                          |j                  t              j	                  t        j                  |j                  k(        j'                         }|dk(  r'|j#                  |       |j%                          d|ddS d||dS # t         $ r Y w xY ww)	Nr  z"No brand kit found for this domainr  Asset not foundr   T)rg  rH  kit_deleted)rg  rH  remaining_assets)r-  r  r   r&   r   r<  r   r   r'   r  rg  r   r   r4  r3  r  r   r  r   r   )r<  rH  r   rq  r  rM  s         r   api_delete_brandkit_assetr  P  sg    \\^!!#F
((8

#
#HOOv$=
>
D
D
FC4XYYHH]#**H$""cff, eg 
 4EFF	ww~~eoo&	IIeoo& IIeIIK'..}/I/ISVV/STZZ\IA~
		#
		XdKKyQQ  		s+   DGG
 *B G
	GGGGc           	      L  K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|st        dd      |j                  t              j	                  t        j                  |k(  t        j                  |j                  k(        j                         }|st        dd      |j                          d {   }d|v r`|d   }t        t        j                               }||vrt        dd|       ||_        t         j                   j#                         |_        d|v r}|d   rq|j                  t              j	                  t        j                  |j                  k(  t        j&                  d	k(        j)                  dd
i       d	|_        d|_        nd
|_        d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_        |j1                          |j3                  |       d	|j                  |j                  t        j4                  |j                  |j                  xs d      t7        |dd
      xs d
|j*                  |j,                  |j.                  dS 7 w)Nr  No brand kit foundr  r  ri  r  zInvalid classification. Valid: r  TFlogorK  rL  r  r  )updatedr  ri  r  r  rK  rL  r  )r-  r  r   r&   r   r<  r   r   r'   r  rg  r/  rl  rd   r  ri  r  r  re  r  r  rK  rL  r  r   r  r   r  )	r<  rH  r   r   rq  r  r  new_cls	valid_clss	            r   api_update_brandkit_assetr  p  sX    \\^!!#F
((8

#
#HOOv$=
>
D
D
FC4HIIHH]#**H$""cff, eg 
 4EFFD4'(.3356	)#C:YZcYd8eff&&//668D !"HH]#****cff4--5 f'/0$(E!#)E $)E!4#$45~&\
t-IIKJJu hh.. 5 9 9%:N:NPUPdPdPjhj k"5*;UCLu..

&&	 	C  s   C2J$4J!5F-J$z0/api/brandkit/{domain}/asset/{asset_id}/downloadc                 |  K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|st        dd      |j                  t              j	                  t        j                  |k(  t        j                  |j                  k(        j                         }|st        dd      t        j                  j                  |j                        st        dd      ddlm}  ||j                  |j"                  d	      S w)
Nr  r  r  r  zFile not found on diskr   FileResponsezapplication/octet-stream)r  r  )r-  r  r   r&   r   r<  r   r   r'   r  rg  r   r   r4  r3  r  r  r  )r<  rH  r   rq  r  r  s         r   api_download_brandkit_assetr    s     \\^!!#F
((8

#
#HOOv$=
>
D
D
FC4HIIHH]#**H$""cff, eg 
 4EFF77>>%//*4LMM0- s   D:D<z,/api/brandkit/{domain}/asset/{asset_id}/textc                 *  K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|st        dd      |j                  t              j	                  t        j                  |k(  t        j                  |j                  k(  t        j                  dk(        j                         }|st        dd      |j                  xs i }|j                  |j                  d      }|sX|j                         D ]E  \  }}t!        |t"              s|j                         |j                  j                         k(  sC|} n |j                  |j                  |dS w)Nr  r  r  rI  Document not foundr  )r  r  r   )r-  r  r   r&   r   r<  r   r   r'   r  rg  rh  r`  r   r  rk  r1  r   )	r<  rH  r   rq  r  r`  r   r   r  s	            r   api_get_brandkit_asset_textr    s>    \\^!!#F
((8

#
#HOOv$=
>
D
D
FC4HIIHH]#**H$""cff,  J. eg	 

 4HII#I==,D!) 	HC#s#		u~~7K7K7M(M	
 ((EEs   EF+F4Fc                 &  K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|st        dd      |j                  t              j	                  t        j                  |k(  t        j                  |j                  k(  t        j                  dk(        j                         }|st        dd      |j                          d {   }|j                  dd      }t        |j                  xs i       }|||j                   <   ||_        dd	lm}	  |	|d
       |j'                          d|j                  |j                   t)        |      dS 7 w)Nr  r  r  rI  r  r   r  r   flag_modifiedr`  T)r  r  r  text_length)r-  r  r   r&   r   r<  r   r   r'   r  rg  rh  r/  r   rP  r`  r  sqlalchemy.orm.attributesr  r   r   )
r<  rH  r   r   rq  r  r  new_textr`  r  s
             r   api_update_brandkit_asset_textr    s;    \\^!!#F
((8

#
#HOOv$=
>
D
D
FC4HIIHH]#**H$""cff,  J. eg	 

 4HIIDxx#HS]](b)I (IennCM7#{#IIK588X[\dXeff  s   DFFB	Fz//api/brandkit/{domain}/asset/{asset_id}/replacer  c                 P  K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|st        dd      |j                  t              j	                  t        j                  |k(  t        j                  |j                  k(        j                         }|st        dd      t        j                  j                  |j                        r0	 |j                  dz   }t        j                  |j                  |       |j#                          d {   }t        j$                  t        j                  j'                  |j                        d       t)        |j                  d      5 }|j+                  |       d d d        d	d l}	t/        |      |_         |	j2                  |      j5                         d d
 |_        |j8                  xs |j8                  |_        |j;                          d|j                  |j8                  |j0                  |j                  j=                  d      sd|j                  z   dS |j                  dS # t         $ r Y Yw xY w7 J# 1 sw Y   xY ww)Nr  r  r  r  z.bakTr   r#  r      r  )replacedr  r  r  r  )r-  r  r   r&   r   r<  r   r   r'   r  rg  r   r   r4  r3  renamer   r  r   dirnamerc  rd  r  r   r  r  r  r  r  r   r   )
r<  rH  r   r  rq  r  backup_pathr  r  r  s
             r   api_replace_brandkit_assetr    s    \\^!!#F
((8

#
#HOOv$=
>
D
D
FC4HIIHH]#**H$""cff, eg 
 4EFF	ww~~eoo&	//F2KIIeoo{3 IIKGKK04@	eoot	$ 	 'lEO$gnnW-779#2>EO]]4ennENIIK hhNN__161K1KC1PC%//) 
 W\VeVe   		   sP   DJ&/J :J&JAJ&&J8CJ&	JJ&JJ&J#J&z/api/brandkit/backfill-hashesc                   K   | j                  t              j                  t        j                  d k(  t        j                  dk(  z        j	                         }d}d}|D ]Z  }t
        j                  j                  |j                        r*t        |j                        }|r||_        |dz  }P|dz  }V|dz  }\ | j                  t              j                  t        j                  d k(  t        j                  d k7  t        j                  dk7        j	                         }d}|D ]u  }dd l}|j                  xs |j                  j                         |_
        |j                  s1|j                  r%t!        j"                  |j                  g       |_        |dz  }w | j%                          |||t'        |      dS w)Nr  r   r   )hashes_updatedhash_errorsclassified_at_backfilledtotal_checked)r   r'   r   r  r  r   r   r4  r3  rj   re  ri  r  r{  r  rj  ri   r   r   r   )	r   rk  r  r  r  halready_classifiedclassified_backfillru  s	            r   api_backfill_hashesr  #  s    XXm$++		 	 D	(]-D-D-JK	ce  GF 	77>>%//*!%//2A"#1!aKF	 -077##t+$$,$$* 
ce	 
 # !#..G#,,2E2E2G%%%*>*>%?%C%CEDXDXZ\%]E"q ! IIK!$7V	 s   F>G c                   K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                         }|st        dd      |j                  D ]L  }t        j                  j                  |j                        s-	 t        j                  |j                         N |j                  |       |j                          d| dS #  Y yxY ww)Nr  r  r  T)rg  r<  )r-  r  r   r&   r   r<  r   r   rk  r   r   r4  r3  r  r  r   )r<  r   rq  r  s       r   api_delete_brandkitr  L  s     \\^!!#F
((8

#
#HOOv$=
>
D
D
FC4HII 77>>%//*		%//* IIcNIIKv..s   B)C;-C4(C;4C86C;z Preparing graphics generation...r   rS  r  zGenerating logo...iconszGenerating section icons...	separatorzGenerating separator...Graphics pack complete!
logo_styleseparator_styler  c                     !"#$ t               }	 t         dddt        t              dz
  d       |j	                  t
              j                  t
        j                  k(        j                  t
        j                  j                               j                         }|s!t         ddd	       	 |j                          y |j                  xs i }|j                  xs i }|j                  xs d
}	i }
|j!                  dg       }|j!                  dd      }|rt        |      |kD  r||   }
|j!                  d|
j!                  d            |
d<   |j!                  d|
j!                  dd
            |
d<   |j"                  xs i }|j!                  dd      }|dk(  rd}h d}|j!                  dg       }g "|rNt%        |t&              r>|D ]8  }|j!                  dd
      |v s"j)                  |j!                  dd
             : n|D ]  }||v s"j)                  |        ddlm  g ##j)                  dd|j/                  dd      j1                          dddd       "D ]<  }#j)                  d| d|j/                  dd      j1                          d dd       > #j)                  d!d"|j1                          dd!dd         j2                         D ]!  \  }}#j)                  d#| |d   d$dd       # i !t        #      $t         d%$ d&d'd#!$dd()        !" #$fd*}t5        |
|	|||||||j6                  +
      }||_        t8        j8                  j;                         |_        |j?                          i }|j!                  d      r6|d   j!                  d,      r"d-|d   d,   |d   j!                  d.d
      d/|d<   |j!                  d0      xs i j3                         D ]9  \  }}|s	|j!                  d,      sd-|d,   |j!                  d.d
      d/|d| <   ; |j!                  d!      r6|d!   j!                  d,      r"d-|d!   d,   |d!   j!                  d.d
      d/|d!<   |j!                  d1      xs i j3                         D ]9  \  }}|s	|j!                  d,      sd-|d,   |j!                  d.d
      d/|d#| <   ; |j!                  d2g       D ]4  }|j!                  d3d
      }|s||vsd|j!                  d4d
      d5||<   6 t         d6d7t        t              dz
  t        t              dz
  d8|j!                  d9i       #|$t        |      d:;       |j                          y # t@        $ rI}tB        jE                  d< d=|        t         dd>tG        |       tG        |      	       Y d }~^d }~ww xY w# |j                          w xY w)?Nr  Loading package data...r   r   rQ  r  r  r  r  r  r'  r  r  r   r  animation_styler  auto>   rs  rP  rM  rJ  rQ  ru  rm  rO  rv  rN  rw  ry  rR  rz  rK  r  r
  )r   r  zLogo (r
  r  r  r  )r   r   r
  ru  icon_zIcon: iconr  zSeparator (
essential_	essentialGenerating z
 assets...rR  r<  r!  completed_assetsr  donerv  ry  rw  r  c                   
 d}d|j                         v rd}nd|j                         v rd}nd|j                         v sld|j                         v sZd|j                         v sHd|j                         v s6d|j                         v s$d	|j                         v sd
|j                         v rd}n| dk\  rd}d }d }d}|j                         
d
v sd
v rd}d
v rd
v rd}nd
v r	d
v rd}d}nd
v rd
v rd}nyd
v r	d
v rd}d}nld
v rD ]  }d| d
v sd| } nS nQd
v st        
fddD              r9 j                         D ]%  \  }}|d   j                         
v s|
v s d| } n |r?||d|<   t        d j	                         D              }	t        || ||	d       y t        || |       y )Nr  r  r  r  faviconnav_logort  og_image
cta_accentemail_   rY  r  r  r   	generatedzicon for'r  c              3   &   K   | ]  }|v  
 y wr  r   )r  r   	msg_lowers     r   r  z=run_graphics_pack_job.<locals>.progress_cb.<locals>.<genexpr>  s       1[Ai  1[s   )r  r  footer_logor  r  email_headerr   r  )ru  r=  c              3   0   K   | ]  }|d    dv sd  yw)ru  )r  r  r   Nr   )r  r8  s     r   r  z=run_graphics_pack_job.<locals>.progress_cb.<locals>.<genexpr>  s      hqakUgFg hr  r  r  )rv  ry  rw  )r  anyrk  r  r2  r  )r  r=  r  	asset_key	asset_urlasset_statusr  ess_keyess_meta
done_countr  r   asset_resultsr  icon_section_typesrl  r!  r  s             @r   r  z*run_graphics_pack_job.<locals>.progress_cb  s   H$!		+&		+yCIIK/G:Y\YbYbYdKdhptwt}t}th  DN  RU  R[  R[  R]  D]  am  qt  qz  qz  q|  a|  @G  KN  KT  KT  KV  @V"%II!L		I9$9(<'"{i'?"	9$Y)>"	'	)kY.F'		)h).C'	'y(, B2$ayI-&+B4L	 	)S  1[  JZ  1[  .[)>)>)>)@ %GX'--/9<9@T&0	$:	
 6B3+Oi(  hM,@,@,B hh
6#X`-8hdq  }I  S]  #^_ 6#X`ar   )
r  r]  moodrC  r<  r  r  r  r  existing_packr   r  rH  )ru  r   rH  r  
essentialsr  r  r   rQ  r  r  rY  rQ  )r<  rQ  r!  r  r  r  r  zGraphics pack job failed for r}  r  )$r   r  r   GRAPHICS_PACK_STEPSr   r    r   r  r  r{  r  r   r   r[  rC  rE  r   rV  r1  rl  r  r  r   ra  r   rk  r{   r  r  r  r|  r   r   r   r   r   )%rl  r  r  r  r  r   r  r[  rC  r]  r  r  r  atmor  ICON_ELIGIBLEr  ri  r   r  r  r  r  packfinal_assetsr  	icon_dataess_typeess_dataerr	err_assetr   r   r  r   r!  r  s%   ``                              @@@@@r   run_graphics_pack_jobr  h  s   	BU6):S#$#6I2JQ2N$*	, hhw&&w':':k'IJSST[TfTfTkTkTmnttvvh=PXklZ 	
W 		RMM'R	  &B
YYy"-
))-q1#j/G3#G,J"YY|Z^^FK5XY
6 %		)Z^^Ir5R S
9~~#xx)>:6>!DG ==R0
8T2 C7762&-7&--cggfb.ABC ! 3-'&--c23 	:&9K9KCQT9U9[9[9]8^^_0`jp  }E  F  	G$ 	HBOOeB4LF2::cSVCWC]C]C_B`:akq  ~F  G  H	H{?CXCXCZB[[\5]gr  G  H  	I!6!6!6!8 	@GXOOj	$:HVDT^iu}~	@ 8}6+l^:(N !F%0h\i  uA  KL  M	N.	b .	b` +!!+)++
 !!**113
		88FV 0 0 7.4T&\%=P^bci^j^n^noy{}^~#L $(HHW$5$;#B#B#D 	JHiY]]51>DYW\M]ktkxkx  zD  FH  lI  4JuXJ/0	J 88K T+%6%:%:5%A39${BSTYBZhlmxhyh}h}  I  KM  iN  )OL%#'88L#9#?R"F"F"H 	MHhHLL/CIRZ[`Raowo{o{  }G  IK  pL  9Mz(45	M 88Hb) 	^C,IYl:5=PWY[H\*]Y'	^
 	6+<U#&':#;a#?"#67!;$.%0488GR;P^f  }I  T`  jm  nz  j{  |		} 	
	  [4[MA3GH6(73q6(9KSVWXSYZZ[ 	
se   B V D!V '-V G0V V BV ,V >A
V 	V A,V 	W?WW  WW   W2z/api/graphics/{domain}/generatec                 &  K   | j                         j                         } |j                  j                  dd      j	                  d      r|j                          d {   ni }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      ddlm}m} |j                  d	d
      }|j                  dd      }|j                  d|      }	|	|vr|}	t%        t'        j(                               d d }
t+        |
d| t-        t.              dz
  t.               t0        j3                  t4        |
| |||	       |
| ddS 7 /w)Nr  r  r  r  !Package not found for this domainr  r   DEFAULT_MODELMODELSr  	icon_textr  r  r  r  r  r   r  r  )r-  r  r  r   r   r/  r   r    r   r  r  r{  r  r   r   r  r  r  r   r  r  r  r   r  r   r  r  )r<  r   r   r+  r  GFX_DEFAULT_MODEL
GFX_MODELSr  r  r  rl  s              r   api_generate_graphics_packr    sF    \\^!!#F#*??#6#6~r#J#U#UVh#ioqD
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4WXX^,4Jhh0&9OHHW/0EJ!r"Fv4G0H10LNab-vvz?\ab)DD%  s   AFF D/Fz/api/graphics/{domain}c                   K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                  t        j                  j                               j                         }|st        dd      | |j                  t        |j                        dS w)Nr  r  r  )r<  r  r_  )r-  r  r   r    r   r  r  r{  r  r   r   r  r}   )r<  r   r  s      r   api_get_graphics_packr    s     \\^!!#F
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHH **,S->->?    B?Cz#/api/graphics/{domain}/download-zipc           	        K   dd l }dd l}| j                         j                         } |j	                  t
              j                  t
        j                  | k(        j                  t
        j                  j                               j                         }|r|j                  st        dd      ddlm}  ||j                        }|st        dd       |j                          } |j"                  |d|j$                        5 }|D ]l  }	|	j'                  dd	      }
|
sd }|
j)                  d
      r-t*        j,                  j/                  d|
t1        d
      d        }n|
j)                  d      r|
}|sot*        j,                  j3                  |      s|	j'                  dd      }|	j'                  dd	      }|	j'                  d|	j'                  dd	            }|	j'                  dd	      }t*        j,                  j5                  |      d   xs d}|dk(  rd| | }n>|dk(  rd| | }n1|dk(  rd| | }n$|dk(  r|	j'                  d|      }| | }n| | }|j7                  |d|        o 	 d d d        |j9                  d       | j;                  dd      }dd lm}  ||d!d"d#| d$i%      S # 1 sw Y   CxY ww)&Nr   r  zNo graphics pack foundr  r   zNo assets in graphics packr  r   r  r   r   r  r
  r  rH  style
style_namesection_typer   r  r  logo_r  r  r  
separator_r  essential_typezgraphics_pack/r  r
  r  r   r  r  z_graphics_pack.zip"r  ) r  r  r-  r  r   r    r   r  r  r{  r  r   r  r   r  r  r  r  r  r   r   r   r   rb  r   r
  r  rd  r  ra  r  r   )r<  r   r  r  r  r  rk  r  r  r  r   r3  rh  rH  r  ri  r  r  r
  safe_domainr   s                        r   api_download_graphics_zipr#  )  s    \\^!!#F
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mCc''4LMM9 !2!23F4PQQ
"**,C	c7#7#7	8 >B 	>E))E2&CI~~j)GGLL3s:7G3HI		*	RWW^^I6"YYvw7
 99Z4		'599\2+FGii3gg&&y1!4>'#E73%0E6)#C5.E;.(u5E;.$yy)98DH'j.E'j.EnUG$<=5	>>: HHQK..c*K5$&*@M`(ab A> >s-   DK
A1J>:J>C!J><AK
>KK
z!/api/graphics/{domain}/regeneratec                 :	   K   | j                         j                         } |j                          d {   |j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      j                  dd      dvrt        dd      |j                  xs i }i }|j                  d	g       }|j                  d
d      }|rt        |      |kD  r||   }|j                  d|j                  d|             |d<   |j                  d|j                  dd            |d<   |j                  xs d}|j                   xs i }	|	j                  dd      }
|
dk(  rd}
ddlm}m} j                  d|      }||vr|}t)        t+        t-        j                  dd            d      d      }j                  dd      }j                  dd      }	 ddlm g }t1        j2                  |j4                  xs i       }t7        |      D ]	  }i }|r||d<   |r||d<   t9        d8|||
| ||j                  dd      j                  dd      j                  dd      j                  dd      j                  d d      j                  d!d"      d#|}|j;                  |       d$k(  r||d$<   d%k(  r&||j=                  d&i       j                  dd      <   ԉd'k(  r||d'<   ߉d(k(  s||j=                  d)i       j                  d!d"      <    |j4                  xs i  d* vrg  d*<    fd+}t?        |      D ]   \  }}|t        |      dz
  k(  } |||,       " t@        j@                  jC                         jE                          d-<    |_        t@        j@                  jC                         |_#        dd.l$m%}  ||d/       |jM                          d0|d1   t        |      |D cg c]  }|d2   	 c}| d3S 7 c c}w # tN        $ r9}tP        jS                  d4 d5|  d6|        t        d7tU        |            d }~ww xY ww)9Nr  r  r  rh  r  )r  r  r  r  r  6asset_type must be logo, icon, separator, or essentialr'  r  r   r  r   r  r  r  r  r  r  versionsr   rd  influence_urlreference_prompt_archive_asset_to_historyr  r  r  r  rN  section_title	icon_hintr!  r  )rh  r  r]  r  r<  r  r  r  r  r  r+  r,  r!  r  r  r  r  r  r  historyc                 p   dk(  r1|rj                  d      r d          |r| d<   n |        ndk(  rUdvri d<   j                  dd      }|r#d   j                  |      r d   |          |r	| d   |<   n |        ndk(  r1|rj                  d      r d          |r| d<   nc |        nYdk(  rTdvri d<   j                  d	d
      }|r#d   j                  |      r d   |          |r	| d   |<   n	 |        dvri d<   did   | d   <   y )Nr  r  r  r  rN  r  r  r  r!  r  asset_indexr
  rH  r  )res	is_activesec_keyr  r*  rh  r+  re  s       r   _store_resultz4api_regenerate_graphics_asset.<locals>._store_result  sy   V#-b"V*=!$BvJ-b#6v%"$"$BwK((>:>G!9-b"W+g2FG+.BwK(-b#6{*!4-b"[/B&)B{O-b#6{*r)')B|$((#3Y?L!1!5!5g!>-b"\2B72KL03B|$W--b#6B&$&=!28*1EB}c*o.r   )r1  r|  r  r  Tr  rH  )r  r  versions_generatedall_asset_idsr<  zAsset regeneration failed (, ): r3  r   )+r-  r  r/  r   r    r   r  r  r{  r  r   r   r   r[  r   rE  rV  r  r  r  r  r  r:  r*  r]  deepcopyr  ranger|   r  r4  r  r  r  r  r|  r  r  r   r   r   r   r   )!r<  r   r   r  r[  r  r  r  r]  r  r  r  r  r  r&  r'  r(  all_resultsworking_packv_idxextra_kwargsr  r3  r  r0  is_lastr  r^  r   r*  rh  r+  re  s!                                @@@@r   api_regenerate_graphics_assetr?  _  s{    \\^!!#FD
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHH,+JCC4lmmIIOEJ9b)Jii)1-Gc*o/(
<1OPJv!IIi	21NOJy"E>>RD88%~6Dv~;HHWm,EF3s488J23Q7;HHH_b1Mxx 2B7h<C}}S%6%6%<"=8_  	jEL0=_-3C/0% %%*hhw4 $):F C!XXnjA"hh;((;3#xx(8)D F  v&V#'-V$v%]c''4TXXnj5YZ{*,2[){*ci''b9$((CSU^:_`A 	jD $"BByM&	FP  , 	2FAsC,q00G#1	2 $,,335??A<!**113;c?+
		  _"%k"25@Aa
mA
 	
A  H B  <2:,bA3OPCF;;<sN   2RQG%RDQ :DQ <Q
Q RQ 	R4RRRz/api/graphics/stylesc                  @  K   t        j                         D  ci c]  \  } }| |
 c}} t        j                         D  ci c]  \  } }| |
 c}} t        j                         D  ci c]  \  } }| |d   |d   |d   d c}} ddddS c c}} w c c}} w c c}} w w)	Nr  r   r   )r  r   r   zNano Banana (Fast)zNano Banana Pro (High Quality))gemini-2.5-flash-imagezgemini-3-pro-image-preview)logo_stylesseparator_stylessite_essentialsmodels)r~   rk  r   r   )r  r8  s     r   api_graphics_stylesrF    s      *5):):)<=A1=.>.D.D.FGdaQTGo~  pE  pE  pG  HgkghjkAagqyQRS`Qabb  H&:*J
	 =G Hs'   BBBBB(B
Bz"/api/graphics/{domain}/save-editedc           	      
  K   ddl }ddl}| j                         j                         } |j	                          d{   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  dd      }|j                  dd      }|j                  d	d      }	|r|st        d
d      |dvrt        d
d      |dv r|	st        d
d      |j                  xs i }
|dk(  r2|
j                  di       j                  |	      st        d
d|	 d      |dk(  r2|
j                  di       j                  |	      st        d
d|	 d      |dk(  r|
j                  d      st        d
d      |dk(  r|
j                  d      st        d
d      d|v r|j!                  dd      d   }	  |j"                  |      }d}t'        |      |kD  rt        d
dt'        |       d       |dd! j)                  d"      s|dd# d$k(  s|dd% d&k(  st        d
d'      dd(lm} |j                  xs i }
d)|
vrg |
d)<   d*|j/                         j0                  dd+  }ddl}|j4                  j7                  d,d-|       } |j8                  |d./       | d0| d1}|j4                  j7                  ||      }t;        |d2      5 }|j=                  |       ddd       d3|  d4| }|||dd5d6d7t>        j>                  jA                         jC                         d8}|dk(  r=|
j                  d      r&|
d   }|j                  d9d      dz   |d9<    ||
|       ||
d<   n|dk(  r=|
j                  d      r&|
d   }|j                  d9d      dz   |d9<    ||
|       ||
d<   n|dk(  rOd|
vri |
d<   |
d   j                  |	      r)|
d   |	   }|j                  d9d      dz   |d9<    ||
|       ||
d   |	<   na|dk(  rOd|
vri |
d<   |
d   j                  |	      r)|
d   |	   }|j                  d9d      dz   |d9<    ||
|       ||
d   |	<   nt        d
d      d:|
vri |
d:<   d;|i|
d:   |<   t>        j>                  jA                         jC                         |
d<<   |
|_        t>        j>                  jA                         |_"        dd=l#m$}  ||d>       |jK                          d.|| d?S 7 # t$        $ r t        d
d      w xY w# 1 sw Y   .xY ww)@z:Save a client-side edited image back to the graphics pack.r   Nr  r  r  image_base64r  rh  r  r  z$image_base64 and asset_type required)r  r  r  r  r%  )r  r  z2asset_key is required for icon and essential typesr  r  zIcon 'u&   ' does not exist — generate it firstr  r  zEssential 'r  u%   No logo exists — generate one firstr  u*   No separator exists — generate one firstr  r   zInvalid base64 image data   zImage too large (z bytes). Maximum is 10MB.r  s   PNGr!  s   r   s   RIFFu?   Invalid image format — only PNG, JPEG, and WebP are supportedr)  r-  zedited-   r   graphicsTr   z-edited-r  r#  /static/graphics/r  editedzHand-editedzfilerobot-editor)r   rH  r  revisionr  r  r&  r{  rN  r/  r
  r|  r  r  )r  r  r<  )&base64r  r-  r  r/  r   r    r   r  r  r{  r  r   r   r   r  r5  	b64decoder   r   r   r  r*  r  hexr   r   rb  r   rc  rd  r  r  r  r|  r  r  r   )r<  r   r   rO  _uuidr+  r  	image_b64rh  r  re  	img_bytesMAX_IMAGE_SIZEr*  new_asset_idr   save_dirr  filepathr  new_url
new_recordoldr  s                           r   api_save_edited_assetr\    s     \\^!!#FD
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHH,I,+Jb)IJ4Z[[CC4lmm**94hii				 bBVRVVGR%8%<%<Y%GfYKGm4noo[ "&&r*B*F*Fy*Qk)Lr4sttVBFF6N4[\\[ )<4`aa
iOOC+A.	Q$F$$Y/	 &N
9~&6GIGWWp4qrrbqM$$Z0IbqM_4TXabdcdXeipXp4uvv?				 bB9U[[]..s345Lww||Hj&9HBKK4(Xl^48Hww||Hh/H	h	 		 "&8*5G #(''..0::<	J V66&>V*C%(WWZ%;a%?Jz"%b#.6
	{	"66+[/C%(WWZ%;a%?Jz"%b#.$;	v	"BwKg;??9%W+i(C%(WWZ%;a%?Jz"%b#.!+7I	{	"r!!B|l	*\"9-C%(WWZ%;a%?Jz"%b#.&0<#4lmmB='-z&:B}l#((//1;;=B|C&&--/CN7#'IIKjFCCc  D  Q4OPPQ, sB   :U#T9G	U#T< C?U#U*HU#<UU#U U#z/api/graphics/{domain}/historyc                   K   | j                         j                         } |j                  t              j	                  t        j
                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  xs i }|j                  dg       }| |t        |      dS w)Nr  r  r  r-  )r<  r-  r   )r-  r  r   r    r   r  r  r{  r  r   r   r  r   r   )r<  r   r  re  r-  s        r   api_get_graphics_historyr^  v  s     \\^!!#F
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHH				 bBffY#G3w<HHs   CCz/api/graphics/{domain}/restorec                   K   | j                         j                         } |j                          d {   }|j                  dd      }|j	                  t
              j                  t
        j                  | k(        j                  t
        j                  j                               j                         }|st        dd      |j                  xs i }|j                  dg       }d }|D ]  }	|	j                  d      |k(  s|	} n |st        dd      dd	lm}
 |j                  d
d      }|dk(  rM|j                  d      r |
||d          |j!                         D ci c]  \  }}|dk7  s|| }}}||d<   nK|dk(  rp|j                  dd      }d|vri |d<   |d   j                  |      r |
||d   |          |j!                         D ci c]  \  }}|dk7  s|| }}}||d   |<   n|dk(  rL|j                  d      r |
||d          |j!                         D ci c]  \  }}|dk7  s|| }}}||d<   n|dk(  rp|j                  dd      }d|vri |d<   |d   j                  |      r |
||d   |          |j!                         D ci c]  \  }}|dk7  s|| }}}||d   |<   nt        dd|       t"        j"                  j%                         j'                         |d<   ||_        t"        j"                  j%                         |_        ddlm}  ||d       |j/                          d||dS 7 c c}}w c c}}w c c}}w c c}}w w)NrH  r  r  r  r  r-  zAsset not found in historyr   r)  r
  r  replaced_atr  r  r  r  r  r!  r  r  zCannot restore asset type: r|  r  r  T)r  restored_asset_idrh  )r-  r  r/  r   r   r    r   r  r  r{  r  r   r   r  r  r*  rk  r  r  r  r|  r  r  r   )r<  r   r   r+  rH  r  re  r-  r  r  r*  rh  r  r8  restoredr  r
  r  s                     r   api_restore_history_assetrc    sK    \\^!!#FDxx
B'H
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHH				 bBffY#GF 88J8+F 4PQQ?FB'JV66&>%b"V*5%+\\^JTQqM7IAqDJJ6
	v	**Y+"BwKg;??7#%b"W+g*>?%+\\^JTQqM7IAqDJJ'7G	{	"66+%b"[/:%+\\^JTQqM7IAqDJJ";	{	"::.3r!!B|l)%b"\*:8*DE%+\\^JTQqM7IAqDJJ%-<"6QR\Q]4^__((//1;;=B|C&&--/CN7#'IIK(*UUq  . K K
 K Ksi   2M(MCM(A!M('M5M:A M(M(M-AM(.M<MAM( M".M"3BM(M(z'/api/graphics/{domain}/upload-referencec                   K   ddl m} |j                          d {   }|j                  d      }|rt	        |d      st        dd      |j                          d {   }t        |      dkD  rt        dd	      t        d
|  d      }|j                  dd       dd l
}|j                  r,t        j                  j                  |j                        d   nd}d|j                         j                   d d  | }	||	z  }
t#        |
d      5 }|j%                  |       d d d        d|
 |	dS 7 7 # 1 sw Y   xY ww)Nr   )r   r  r  r  zNo file uploadedr  rI  zFile too large (max 10MB)zstatic/graphics/z/referencesT)parentsr   r   r  zref-r  r#  r  r   r  )starlette.datastructuresr   r  r   r>  r   r  r   r   mkdirr  r  r   r   r  r  rQ  rc  rd  )r<  r   StarletteUploadr  r  r  ref_dirrR  r  r  fpathr  s               r   api_upload_reference_imagerl    s,    FD88FDwtV,4FGGIIKG
7|&&4OPP%fX[9:GMM$M.04"''

4==
)!
,6C5;;=$$Ra()#/EeOE	eT	 a	 ug;E22%  
   s;   ED5AE D8!B2ED:%E8E:E?Ez'/api/graphics/{domain}/port-to-brandkitc                    K   ddl m}  || |      }|j                  d      dk(  rt        d|j                  dd            |S w)	Nr   )port_graphics_to_brandkitru  r   r  r<  Unknown errorr  )app.services.brandkitrn  r   r   )r<  r   rn  r  s       r   api_port_graphics_to_brandkitrq    sC     ?&vr2Fzz(w&FJJy/4Z[[Mr  z./api/graphics/{domain}/port-single-to-brandkitc                 R  K   |j                          d {   }|j                  dd      }|j                  dd      }|j                  dd      }|st        dd      d	d
lm}  || ||||      }|j                  d      dk(  rt        d|j                  dd            |S 7 w)Nr   r  r  ri  rI  r  zAsset URL is requiredr  r   )port_single_asset_to_brandkitru  r   r<  ro  )r/  r   r   rp  rs  )	r<  r   r   r  r  asset_filenameasset_classificationrs  r  s	            r   !api_port_single_asset_to_brandkitrv    s     D#IXXj"-N88$4g>4KLLC*69nNbdfgFzz(w&FJJy/4Z[[M  s   B'B%BB'z#/api/graphics/{domain}/download-allc           
        K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      |j                  xs i }ddl
m}  ||      }|st        dd      t        j                         }t        j                  |dt        j                         5 }|D ]  }|j#                  dd	      }	|j#                  d
t$        j&                  j)                  |	            }
|	j+                  d      }t$        j&                  j-                  |      su|j#                  dd      }|j/                  ||  d| d|
         	 d d d        |j1                  d       ddlm}  ||ddd|  di      S # 1 sw Y   1xY ww)Nr  r  r  r   r   zNo graphics pack assets foundr  r   r  r  r  r
  miscz
-graphics/r  r   r  zattachment; filename=z-graphics-pack.zipr  )r   r    r   r  r  r{  r  r   r   r  r  r  r  r  r  r  r  r   r   r   r  r5  r4  rd  r  r  r   )r<  r   rs  re  r  rk  
zip_bufferr  r  r   r  r3  rh  r   s                 r   api_download_all_graphicsrz    s    hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH				$"B9 $F4STTJ	S'*>*>	? O2 	OE))E2&CIIj"''*:*:3*?@E

3Iww~~i("YYvv6
vhjAeW$MN	OO OOA5$&*?xGY(Z[ O Os%   C$G	&A7F=.F=0G	=GG	z/api/job/{job_id}c                 B   K   t        |       }|st        dd      |S w)Nr  Job not foundr  )r  r   )rl  r  s     r   api_job_statusr}    s%     
v
CODDJ   z/api/job/{job_id}/streamc                 6    K    fd}t         |             S w)Nc                 ^  K   d} 	 t              }|sF| dz  } | dk\  rdt        j                  ddi      d y t        j                  d       d {    Td} dt        j                  |      d |j                  d	      d
v ry t        j                  d       d {    7 T7 w)Nr   r   r!  r   r|  eventr        ?progressru  )r  r  皙?)r  r/  r  asynciosleepr   )
miss_countr  rl  s     r   event_generatorz'api_job_stream.<locals>.event_generator  s     
v&Ca
?$+TZZ/@Z5[\\mmC(((J&

3@@wwx $;;--$$$!  ) %s%   AB-B)AB-#B+$B-+B-r   )rl  r  s   ` r   api_job_streamr    s     %( 011   z/api/batch/{batch_id}/streamc                 6    K    fd}t         |             S w)Nc            
       K   d} d }	 t              }|sF| dz  } | dk\  rdt        j                  ddi      d y t        j                  d       d {    Td} |j                  d       d|j                  d	       dt        |j                  d
      xs i j                  dg              }||k7  rdt        j                  |      d |}nWdt        j                  t        j                  j                         j                         |j                  d      d      d |j                  d      dv rdt        j                  |      d y t        j                  d       d {    q7 $7 	w)Nr   r   rd  r   rC  r  ru  r
  ry  r  r   batch_update	heartbeat)tsru  rG  batch_complete      ?)
r  r/  r  r  r  r   r   r  r  r  )r  	last_hashr  current_hashr   s       r   batch_event_generatorz/api_batch_stream.<locals>.batch_event_generator2  s    
	x(Ca
?$+TZZJ[@\5]^^mmA&&&J!ggh/0#''.2I1J!CQTQXQXYaQbQhfhPmPmnwy{P|L}K~Ly( .

3HH(	 +TZZxGXGXG_G_GaGkGkGmy|  zA  zA  BJ  zK  AL  6M  N  Nwwx $FF 0$**S/JJ--$$$/  '  %s%   AE?E:DE?3E=4E?=E?r   )r   r  s   ` r   api_batch_streamr  0  s     %8 4677r  c                 &  K   t               }	 |j                  t              j                  t        j                  j                               }| rX| dk(  r1|j                  t        j                  j                  ddg            }n"|j                  t        j                  | k(        }|j                  |      j                         }d|D cg c]  }|j                          c}i|j                          S c c}w # |j                          w xY ww)Nr   rs  r  r  )r   r   r"   r  r{  r  r   ru  r  r[  r  r  r   )ru  r[  r   r   r  r  s         r   api_jobs_listr  Q  s     	B
&&s~~':':'<=!SZZ^^Y	4J%KLSZZ6%9:{{5!%%'d334

 4

s/   DB>C< C7#C< &D7C< <DDz/api/job/{job_id}/retryc                   K   t               }	 |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  dvrt        dd      |j                  xs i }|j                  }|j                  d      xs |j                  }t        t        j                               d d }|d	k(  rq|j                  d
d      }||d}t        |d	|t!        t"              dz
  t"        ||        t$        j'                  t(        |||       ||d	d| d|j+                          S |dk(  r{|j                  dd      }	|j                  dd      }
|j                  dd      }|j                  dd      }|j                  d      }|j                  d      }|j                  dd      }|	s|j                  t,              j                  t,        j                  |k(        j                         }|r?|j.                  r3|j.                  j                  dg       }|r|d   j                  dd       }	|st1        d!      }||	|
|||||d"}t        |d|t!        t2              dz
  t2        ||        t$        j'                  t4        |||	|
|||||
       |||	dd| d#|j+                          S |d$k(  rt        dd%      t        dd&|       # |j+                          w xY ww)'Nr  r|  r  )r  r  zOnly failed jobs can be retriedr<  r  r  r=  r  r
  r   )rp  rq  r  )rl  r<  rm  ru  rq  rJ  rF  rH  rG  rJ  rI  rL  rK  rM  rN  rO  r   r  r   r   Generalr;  rI  )rl  r<  r]  rm  ru  rq  
ftp_deployz7FTP deploy jobs should be retried from the deploy panelz"Retry not supported for job type: )r   r   r"   r   rl  r   r   ru  rp  rm  r   r<  r   r  r  r  r   r  r   r  r  r   r   r  rJ   r  r  )rl  r   original_jobparamsrm  r  
new_job_idr=  rp  rF  rH  rJ  rL  rM  rN  rO  ro  r  s                     r   api_job_retryr  a  s    	B=xx}++CJJ&,@AGGICHHk1C8YZZ**0b((jj*Al.A.A&r*
y  **]B7K&1+NLz9k3~;NQR;RTb$06C 0*k;W(KYbky  AT 	
Q  L"5J"JJ?M!::noFLjjJ7G &

+> ?

;/I!::ni@L " 0 7 78T U [ [ ] ]%;%;*3377"EF%+AY]]69%E
1/B	 &Z!."9J&	L z7K[9IA9M{$06Cz;
M!<)\ )K*biu~  MS  T 	
 %C8qrr  C:\]e\f8ghh 	
s0   LD-K/ ;LE0K/ <L"K/ /LLz/api/blueprint/defaultr  c                 $   K   t        |       }|S wr  )rJ   )r  rN  s     r   api_blueprint_defaultr    s     %e,Is   z/api/blueprint/presetsc                  .   K   t         t        t        dS w)N)presets
categoriesvisual_options)rQ   rO   rP   r   r   r   api_blueprint_presetsr    s      )(0 s   z/api/blueprint/validatec                 X   K   | j                          d {   }t        |      }|S 7 wr  )r/  rK   )r  r  r  s      r   api_blueprint_validater    s(     D%FM s   *(*z/api/blueprint/import-contentc                    K   | j                          d {   }|j                  dd      }|j                  dd      } |j                         st        dd      t	        ||      }|t        |      dS 7 `w)	Nr   r  formatr  r  zNo content providedr  )r6  field_count)r/  r   r-  r   rM   r   )r  r  r   format_typer6  s        r   api_blueprint_import_contentr    sm     D88FBD((8V,K4::<4IJJ#D+6FS[99 s   A9A7A!A9z$/api/blueprint/completeness/{domain}c                 R  K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      t        d      }t        |j                  xs i |      }|S w)Nr  r,  r  r%  )r   r    r   r  r  r{  r  r   r   rJ   rL   rC  )r<  r   r  rN  r  s        r   api_blueprint_completenessr    s     
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4FGG%k2I)#--*=2yILs   B%B'z/api/domainsc                 t  K   | j                  t              j                  t        j                  j	                               j                         }g }|D ]  }| j                  t              j                  t        j                  |j                  k(        j                         }|j                  |j                  |j                  |j                  d u|j                  r|j                  j                         nd |j                  ||j                  r|j                  j                         nd d        |S w)N)r  r<  r  r  r  package_countr{  )r   r   r  r{  r  r  r    r   rD  r  r   r  r<  r  r  r  )r   r   rX  r  	pkg_counts        r   api_list_domainsr    s     hhv''(9(9(>(>(@AEEGGG 	HHW%,,W->->!$$-FGMMO	$$!((

$.891==2244

&67ll!,,002
 		 Ns   D6D8z/api/packages/{domain}c                 4  K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }g }|D ]  }|j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                   |j
                  r|j
                  j#                         nd d
        |S w)N)
r  r<  rE  r[  rC  r(  rF  rH  rM  r{  )r   r    r   r  r  r{  r  r  r  r  rE  r[  rC  r(  rF  rH  rM  r  )r<  r   r  rX  r  s        r   api_get_packagesr    s     xx ''(;(;v(EFOOPWPbPbPgPgPijnnpHG $$!--WW1;;..!"!4!467ll!,,002
 	 Ns   DDz/site/{domain}c           
        K   |j                  t              j                  t        j                  |k(        j	                  t        j
                  j                               j                         }|st        dd      ddl	m
} ddlm}m} |j                  xs i } ||j                  xs i       } ||d      \  }}	 ||d      \  }}
|	j                   s|
j                   rEt"        j%                  d	| d
t'        |	j                          dt'        |
j                          d       |j)                  dd      }|j)                  dg       }|r|t'        |      k  r||   n|dd}|j                  t*              j                  t*        j,                  |k(        j                         }i }|rX|j                  t.              j                  t.        j0                  |j2                  k(        j5                         }t7        |      }ddlm}m} d}|r,|j>                  r |j>                  xs i j)                  dd      } ||j)                  dd      |j)                  dd      |j)                  dd      |j@                  xs d|||jB                        } ||      }|j                  tD              j                  tD        j                  |k(        j	                  tD        j
                        j5                         }tF        jI                  di d| d|d|d|d|d |d!|d"|jJ                  d#|jL                  xs d$d%|jN                  xs d&d'|jP                  xs d(d)|d*|d+|d,|d-|jR                  xs i       S w).Nr  r  r  r   rA  rC  TrF  z[site_preview:] Repaired  site_copy +  brand issues on readr(  r'  r  r  rM  rP  r)  rQ  r+  rR  r-  rS  rT  rW  r   r<  r[  r  rX  rC  rs  rF  rH  rG  rJ  rI  rL  rK  rY  rZ  r[  r  r  )*r   r    r   r  r  r{  r  r   r   r\  rB  r]  rD  rE  r[  rC  repairsr   r   r   r   r&   r<  r'   rg  r  r  rk   r^  rN  rO  r_  rE  rV  r$   r  r  rF  rH  rJ  rL  r  )r   r<  r   rs  rB  rD  rE  r[  rC  rc  rd  r  r'  r  rq  rY  r  rN  rO  rU  rZ  r[  r  s                          r   site_previewr    sz    hhw&&w':':f'DENNwOaOaOfOfOhiooqG4VWW6JMMRE$W%6%6%<"=I/	tLI{(DAE<l22nVHKK<O<O8P7QQ^_bcocwcw_x^y  zO  P  	Qiiq1Oii	2&G/6?SQX\;Y7?+hn{}_~L
((8

#
#HOOv$=
>
D
D
FCN
XXm,33M4N4NRURXRX4XY]]_
4Z@LJ
s{{kk'R,,VR8
!		/95))-y9yy3""(b%%E #5)Ixx ''(;(;v(EFOOPWPbPbcggiH%%k 474$f4.5|4e4,g47BI4 	74 -g.D.D4 	..8&	4
 	,,?4 	7??0j4 	.4 	4 $Y4 	H4 	..4"4  s   NNz/sales/{domain}c                   K   |j                  t              j                  t        j                  |k(        j	                  t        j
                  j                               j                         }|st        dd      |j                  xs d}i }i }d}d}|}	t        |t              r|}
nHt        |t              r6|j                         j                  d      r	 t        j                   |      }
nd }
|
rt        |
t              rd|
v r}|
j'                  di       }|
j'                  d      r|
d   }|s4|j(                  r(t        |j(                  t              r|j(                  ni }d }t        |t              r|j'                  d	i       }t        |t              r7|j'                  d
      xs$ |j'                  d      xs |j'                  d      }|s&dD ]!  }||v st        ||   t              s||   } n |sHt        |
t              r8dD ]3  }||
v st        |
|   t              st+        |
|         dkD  s.|
|   } n |rXt        |t              rGt+        |j                               dkD  r*t-        |      }|}	d}n|
rt        |
t              rdD ]1  }||
v st        |
|   t              st-        |
|         }|
|   }	d} n |s_d}|
j/                         D ]-  }t        |t              st+        |      t+        |      kD  s,|}/ t+        |      dkD  rt-        |      }|}	d}t        |j(                  t              r|j(                  ni }nG|r|j                         rt-        |      }d}t        |j(                  t              r|j(                  ni }|s(t        |j(                  t              r|j(                  ni }|s2|j0                  r&t        |j0                  t              r|j0                  }|j'                  dg       }|j'                  d|j'                  dd            }|r|t+        |      k  r||   ni }|j'                  d      xs5 |j'                  d      xs" |j'                  di       j'                  dd      }|j'                  d      xs5 |j'                  d      xs" |j'                  di       j'                  dd      }|j'                  d      xs |j'                  dd      }|j'                  di       j'                  d d!      }dd"lm}m} d}|j                  t8              j                  t8        j:                  |k(        j                         }|r,|j<                  r |j<                  xs i j'                  d#d      } |||||j>                  xs d|||j@                  $      } ||      }|jB                  }|r|j                  tD              j                  tD        jF                  |jH                  k(  tD        jJ                  jM                  g d%            jO                         }|r8|d   jP                  } | r'| j                  d&      sd&| jS                  d&      z   n| }tT        jW                  d'| ||j>                  xs d||||	||||||||d(      S # t        j"                  t$        f$ r d }
Y w xY ww))Nr  r  r  r  Fr#  rC  r[  ry  sales_letter_mdr'  r(  )r  r'  r(  r%  )r%  r  r'  r(  r  r)  r,  r  Tr$  r'  recommended_indexr(  r   r)  paletter0  rQ  r+  r2  rR  r-  rS  
backgroundz#FFFFFFrM  rP  rT  r-  r  r  )r   r<  rE  rF  has_markdownsales_letter_htmlsales_letter_rawrC  r  r  primary_coloraccent_colorbg_colorrZ  r[  ),r   r    r   r  r  r{  r  r   r   r(  r1  rP  r   r-  r   r/  r0  r3  r4  r   r[  r   r9  r2  rC  r^  rN  rO  r&   r<  r_  rE  rV  rF  r'   rg  r  ri  r  r  r3  r5  r  r  )!r   r<  r   rs  
raw_letterrC  r  r  r  r  r6  sl_mdry  
search_keyr   r7  r8  rX  r  r  r  r  accent2r  rN  rO  rU  rq  rZ  r[  rF  r7  r8  s!                                    r   r=  r=  &  sn    hhw&&w':':f'DENNwOaOaOfOfOhiooqG4VWW%%+JIJL!*d#	J	$)9)9);)F)Fs)K	ZZ
+F *VT*{f/DJJ{B/	::gJgmm*4W]]D*IrJi&!k26I)T*!&78  DIMMJa<b  Dfofsfs  uC  gD"r J!Y.:i
>SUX3Y )* 5 FD1 F 
'Jvj7I3,OTWX^_iXjTknqTq":.E Zs+EKKM0BR0G / 6$L	Jvt, S 	Cf}F3K!=$3F3K$@!#)#; #	 K]]_ $a%#a&3{3C*C"#K$ ;#%$3K$@!#. #&0&EW]]2
***, /
 ;L&0&EW]]2
&0&EW]]2
**z':K:KT/R%%	NN9b1Mnn0*..PQ2RSG-:w]I[?[=)acLNN?3  V|7G7G7X  V\h\l\lmvxz\{\\  AJ  LU  ]VM>>"34  X8H8HIZ8[  X_k_o_opy{}_~  `C  `C  DL  NW  `XLnn^,[0@0@QZ0[G	2.22<KHLJ
((8

#
#HOOv$=
>
D
D
FC
s{{kk'R,,VR8
!""(b%%E #5)I++N
hh}-44&&#&&0((,,-_`
 #% 	 !!n..GBIBTBTUXBYw~~c':!:_f%%lf,,2($., $&$5   $$n5 	F	sc   C[Z7 2C0[#[7#[[/[A%['[;?[;[N$[7[[[[z/api/export/{domain}c                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }t        j                         }t        j                  |dt        j                         5 }|j"                  r|j"                  }|j%                  |  dt'        j(                  |d             |j+                  dg       }|rt        j,                         }t/        j0                  |g d	
      }	|	j3                          |D ]E  }
i |
}d|v r*t5        |d   t6              rdj9                  |d         |d<   |	j;                  |       G |j%                  |  d|j=                                |j+                  d      r|j%                  |  d|d          ddlm } ddl!m"}m#} |D ]  }|jH                  jK                  dd      jM                         d d }|  d| }|jN                  xs i } ||jP                  xs i       } ||d      \  }} ||d      \  }}| dd}|j+                  dg       }|j+                  dd      }|r|tS        |      k  r||   }tU        | ||||jV                        }|j%                  | d|       |jX                  r|jX                  }|j[                         j]                  d      r	 t'        j^                  |      }|j+                  d      xsa |j+                  d       xsN |j+                  d!      xs; |j+                  d"      xs( |j+                  d#      xs |j+                  d$      xs |}te        | |jH                  ||      }|j%                  | d%|       |j%                  | d&|       |j%                  | d't'        j(                  |d             |j%                  | d(t'        j(                  |d             |jf                  r4|j%                  | d)t'        j(                  |jf                  d             |jV                  rO|jV                  ji                  d*      }tj        jl                  jo                  |      r|jq                  || d+       |jr                  xs i }|ju                         D ]  \  }}t5        |tv              s|j+                  d,      s)|d,   ji                  d*      } tj        jl                  jo                  |       s]|j+                  d-tj        jl                  jy                  |             }!|jq                  | | d.|!         |jz                  r9t5        |jz                  tv              r|jz                  }"|"j+                  d/g       }#|"j+                  d0i       }$t}        |#      D ]  \  }%}&|&j+                  d1d2|%       }'t        j                  d3d|&j+                  d4d      xs |'jK                  dd      jM                               d d5 }(|'|$v r|j%                  | d6|( d7|$|'          |j%                  | d6|( d8t'        j(                  |&dt        9              |"j+                  d:      r|j%                  | d;|"d:          |j                  rOt5        |j                  tv              r4|j                  })	 dd<lCmD}* i }+|jN                  xs i j+                  dg       },|jN                  xs i j+                  dd      }-|,rI|-tS        |,      k  r;|,|-   }.|.j+                  d=d>      |.j+                  d?d@      |.j+                  dAdB      dC}+ |*|)|+      }/|j%                  | dD|/       |)ju                         D 01ci c]  \  }0}1|0dEk7  s|0|1 }2}0}1tS        |)j+                  dEi             |2dF<   |j%                  | dGt'        j(                  |)dt        9             |j                  t              j                  t        j                  |j                  k(        j                         }3t               }4|3D ]  }5t        j                  d3d|5j                  jK                  dd      jM                               d d5 }6|6sdH|5j                   }6|6|4v r|6 d|5j                   }6|6|4v r|4j                  |6       |5j                  r"|j%                  | dI|6 d7|5j                         |5j                  s|j%                  | dI|6 dJt'        j(                  |5j                  d               g }7|j                         D ]  }8|7j                  |8j                  |8j                  |8j                  |8j                  d   dKdL|8j                  dM   dNdL|8j                  d   dNdO|8j                  dP   dNdQ|8j                  dR   dNdQ|8j                  dS   dNdT        | t        j                  j                         j                         tS        |7      |7dU}9|j%                  |  dVt'        j(                  |9d             d d d        tS        |j=                               }:|j                  d       | jK                  dWd      };t        |dXdY|; dZt        |:      d[\      S # t&        j`                  tb        f$ r Y {w xY w# t        $ r Y iw xY wc c}1}0w # 1 sw Y   xY ww)]Nr  r  r  r  z/analysis.jsonrR  r  r  
r   r   synopsisr  r  r  valuation_bandr!  requires_inventoryaffiliate_programs
fieldnamesr  ; z/niches.csvr  z/domain_summary.txtr   rA  rC  r  r
  r   z
/packages/TrF  r  r  r'  r(  z
/site.htmlr#  r%  r&  r'  r  r)  r+  z/sales_letter.htmlz/sales_letter.mdz/brand.jsonz/site_copy.jsonz/discovery_answers.jsonr  z/hero_image.pngr   r  z/images/r7  renderedr  calc_z
[^a-z0-9_]r   r  z/calculators/r  z
_spec.jsonr  html_bundlez"/calculators/_all_calculators.html)render_reference_htmlr)  r*  r+  r,  r-  r.  r/  z/reference_library/index.htmlr  r  z/reference_library/data.jsonaugment_z
/augments/z_config.json04dr  r   02dTr!  :r   rd  )r  
size_bytescompress_sizedate)r<  exported_attotal_filesr|  z/manifest.jsonr  r   attachment; filename="aura_z_export.zip")r  z
X-Zip-Sizer  )Yr   r   r   r<  r   r   r    r  r  r{  r  r  r  r  r  r  r  r  r	  r/  r  r   r  r  
DictWriterwriteheaderr1  rl  rb  writerowgetvaluer\  rB  r]  rD  rE  rE  ra  r  r[  rC  r   r  rF  r(  r-  r   r0  r3  r4  generate_standalone_sales_htmlrM  r5  r   r   r4  rd  feature_imagesrk  rP  r  r3  r  r`  ra  r   rG  rf  r  r   r$   r  r  r   r   r   r  r   infolistr  r  r  r  	date_timer  r  r  r  r   )<r<  r   ro  r  ry  r  r  r  
csv_bufferwriterrR  r  rB  rD  rE  r  
niche_slugpkg_dirr[  rC  r
  r  r{  r|  r)  	raw_salesparsed_sales
sales_htmlru  feature_imgsfi_keyfi_datafi_pathfi_filename	calc_datar7  r  cispeccalc_id	calc_nameref_libr  brand_colors_exportopts_erec_eselref_htmlr  r8  ref_datar  
seen_slugsr"  aug_slugmanifest_filesr  r!  zip_sizer  s<                                                               r   api_export_domainr    s4    HHV$++FMMV,CDJJLM4FGGxx ''(;(;v(EFOOPWPbPbPgPgPijnnpHJ	S'*>*>	? FO2!!$--HKK6(.14::hq3QR\\(B/F[[]

 @ 
 ""$ )AQ%C+s2z#FZB[]a7b48IIcBV>W4X01OOC(	)
 vhk2J4G4G4IJ||,-vh&9:HEU<VW:N [	pC))11#s;AACCRHJ
:,7GIIOE,S]]-@bAI-iTJLIq%e>HE1$*r:L99Y+D))M1-Cc$i#Cy5flES\^a^p^pqIKK7):.	:,,	??$//4'+zz)'<$0$4$45G$H  %CLL\L\]lLm  %Cq}  rB  rB  CZ  r[  %C  _k  _o  _o  py  _z  %C  ~J  ~N  ~N  OY  ~Z  %C  ^j  ^n  ^n  ou  ^v  %C  zC	 <FCDTDTV_afg
wi'9:JGwi'78)DKK7);/E!1LMKK7)?3TZZ	RS5TU$$wi'>?CLaLajkAlm!!--44S977>>(+HHX'/'BC--3L#/#5#5#7 Mgt,U1C%en33C8Gww~~g.&-kk*bgg>N>Nw>W&XWIXk]*KLM :coot#DOO	!gr2$==R8 )% 0 yHB"hhtuRD\:G "}b488GR;P;[T[:d:dehjm:n:t:t:v wx{y{ |I(*wi}YKu$MxX_O`aKK7)=: NPTPZPZ[_hisvPwxy ==/KK7)+M NPYZgPhi$$C4I4I4)P//T*,'!iio2229bAF YY_"11-CE%#f+"5$Um:=''/S\:]lolsls  uF  HQ  mR  ^a  ^e  ^e  ft  v  ^@  /A+4W>QRHKK7)+H I8T .5]]_PTQZAqDPP,/J0K,L)wi'CDdjjQXabloFpqxx(//0B0Bcff0LMQQSHJ 
p66-SYY5F5FsC5P5V5V5XYZ][]^!)#&&2H*,"*1SVVH5H *,x(##KK7):hZu EsGWGWX::KK7):hZ| LdjjY\YcYclmNno
pc[	pz KKM 	D!! MM"nn!%!3!3>>!,S14>>!3DS2I4>>Z[K\]`Jaabcgcqcqrsctuxbyyz{  |J  |J  KL  |M  NQ  {R  RS  TX  Tb  Tb  cd  Te  fi  Sj  k	# 	 #,,335??A~.#	
 	vhn-tzz(1/MNMFOP :&&()HOOAsC(I0%@<#Xh-
 s !00.A d ! PMFO FOs   C:m=<Im1B	l;E'm1m13m1
Gm1B1m>m1m+
m+
$Dm1=Am1	Em1A"m=;mm1mm1	m($m1'm((	m11m:6m=z/api/export/{domain}/pdfscreenshotsc                 <  K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      ddl	m
}m} g }|r	 d} || |t               d {   } |||r|nd       }	dd l}
|D ]  }	 t!        j"                  |        |rI	 t         j$                  j'                  |d         }|r$|j)                  d	      r|
j+                  |d
       | j-                  dd      }t/        t1        j2                  |	      ddd| di      S 7 # t        $ r}t        d|        Y d }~d }~ww xY w# t        $ r Y w xY w# t        $ r Y yw xY ww)Nr  r  r  r   )generate_package_pdfcapture_site_screenshotszhttp://0.0.0.0:5000z8[export] Screenshot capture failed, continuing without: )r	  z/tmp/aura_screenshots_T)ignore_errorsr  r
  application/pdfr  r  z_presentation.pdf"r  )r   r    r   r  r  r{  r  r   r   app.services.exportr  r  r  r   printshutilr   unlinkr   r  r   rmtreera  r   r  r  )r<  r	  r   r  r  r  screenshot_pathsr  r   	pdf_bytesr  r   parentr  s                 r   api_export_pdfr  F  s    
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHHR	R,H%=fhPb%cc %SJZ6F`deI 	IIbM
 	WW__%5a%89F&++,DEfD9 sC(I


9$&*Ei[Pb(cd +  d 	RLQCPQQ	R  		  		s   B
FE  E!E %F=E>FAF 9FE 	E;#E61F6E;;F>	F
F	F

F	FFFFz/api/export/valuation/{domain}c                   K   |j                   j                  d      }|st        dd      |j                  t              j                  t        j                  | k(        j                         }|r|j                  st        dd      ddl	m
} dd	lm}  || |j                        } || |      }t        |d
dd|  di      S w)Nr   r   r   r  r  Domain not analyzedr   rV   )generate_valuation_pdfr  r  r  z_valuation.pdf")r  r  r  )r   r   r   r   r   r   r<  r   r  r  rW   r  r  r   )	r<  r   r   r   ro  rW   r  r  r  s	            r   export_valuation_pdfr  n  s     "":.H4MNNHHV$++FMMV,CDJJLM 6 64IJJ5:v}'='=>I&vy9II2C15KF8Sb3cdf fs   CCz/api/export/{domain}/mdc                   K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      ddl	m
}  ||      }| j                  dd      }t        t        j                  |j                  d            d	d
d| di      S w)Nr  r  r  r   )generate_package_markdownr  r
  utf-8ztext/markdownr  r  z_package.md"r  )r   r    r   r  r  r{  r  r   r   r  r  ra  r   r  r  encode)r<  r   r  r  
md_contentr  s         r   api_export_mdr!    s     
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHH=*3/JsC(I


:$$W-."&*Ei[P\(]^ s   CCc                     dd l } |j                  dd|j                               j                  d      }|r|  d| S t	        |       S )Nr   z
[^a-z0-9]+r  )r`  ra  r  r-  r   )
augment_idr   r`  r   s       r   r  r    sF    266-ekkm4::3?D%)j\4&!>s:>r   c                     | syd}| D ]f  }t        |j                  |j                        }|j                  xs d}|d| d| d| d|j                   d|d d  t	        |      dkD  rdnd d	z  }h d
| dS )Nr  z<a href="tools/a  .html" style="display:block;background:#fff;border-radius:16px;padding:24px;border:1px solid #e5e7eb;text-decoration:none;transition:transform 0.2s,box-shadow 0.2s" onmouseover="this.style.transform='translateY(-4px)';this.style.boxShadow='0 12px 40px rgba(0,0,0,0.08)'" onmouseout="this.style.transform='';this.style.boxShadow=''">
<div style="display:flex;align-items:start;gap:16px">
<div style="width:40px;height:40px;border-radius:10px;background:linear-gradient(135deg,r  z);display:flex;align-items:center;justify-content:center;flex-shrink:0">
<span style="color:#fff;font-size:1.2rem">&#9881;</span>
</div>
<div style="flex:1;min-width:0">
<div style="font-weight:700;color:#1f2937;margin-bottom:4px">zE</div>
<div style="color:#6b7280;font-size:0.875rem;line-height:1.5">r  r  zb</div>
</div>
<span style="color:#9ca3af;font-size:1.2rem;flex-shrink:0">&#8594;</span>
</div></a>a  <section id="tools" class="section" style="background:#f9fafb">
<div class="container">
<h2 style="font-size:2rem;font-weight:800;text-align:center;margin-bottom:12px">Tools & Resources</h2>
<p style="text-align:center;color:#6b7280;margin-bottom:48px;max-width:600px;margin-left:auto;margin-right:auto">Interactive tools to help you get the most out of your business.</p>
<div class="grid-2" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px"></div>
</div></section>)r  r  r   r   r   )r  r0  r1  cardsr"  r   r  s          r   "_generate_standalone_tools_sectionr'    s    E SVVSYY/$"_TF +YY`Xaabclbm n> ?Bii[ I??CDSzlTWX\T]`cTc5ikJl m
 
	l mrkr s	 r   c           	      8   dd l }|j                  dd      }|j                  dd      }|j                  d|       }|j                  dd      }	|j                  |j                  xs d	|j                         }
|j                  |j
                  xs d      }d}|xs g D ]  }|j                  |j                  k7  st        |j                  |j                  xs d
|j                         }|d| d|j                  |j                  xs d	|j                          dz  } |j                  xs d}|sd| d}dj                  g d|
 d| d| d| d| d| d| d| d| d| d|
 d| d| d| d|	 d      S ) Nr   r)  rQ  r+  rR  r   r  r  zTool ztool-	<a href="zU.html" style="color:#6b7280;font-size:0.875rem;font-weight:500;text-decoration:none">z</a> aY  <div style="padding:48px;text-align:center;color:#6b7280">
<p style="font-size:3rem;margin-bottom:16px">&#128338;</p>
<h3 style="font-weight:700;color:#374151;margin-bottom:8px">Content Being Generated</h3>
<p>This tool is still being prepared. Check back shortly.</p>
<a href="index.html" style="display:inline-block;margin-top:24px;background:zm;color:#fff;padding:10px 24px;border-radius:8px;font-weight:600;text-decoration:none">Back to Site</a>
</div><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
<title> - z</title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#1f2937;-webkit-font-smoothing:antialiased;background:#f9fafb}
a{color:a  ;text-decoration:none}
.augment-wrap{max-width:900px;margin:0 auto;padding:40px 24px}
@media(max-width:768px){.augment-wrap{padding:24px 16px}}
</style></head>
<body>
<nav style="background:rgba(255,255,255,0.95);backdrop-filter:blur(8px);padding:12px 24px;border-bottom:1px solid #e5e7eb;position:sticky;top:0;z-index:100">
<div style="max-width:1100px;margin:0 auto;display:flex;justify-content:space-between;align-items:center">
<a href="../index.html" style="font-size:1.125rem;font-weight:800;background:linear-gradient(135deg,r  zY);-webkit-background-clip:text;-webkit-text-fill-color:transparent;text-decoration:none">z</a>
<div style="display:flex;gap:16px;align-items:center">
<a href="../index.html" style="color:#6b7280;font-size:0.875rem;font-weight:500;text-decoration:none">&#8592; Back to Site</a>
z
</div></div></nav>

<div class="augment-wrap">
<div style="text-align:center;margin-bottom:32px">
<span style="display:inline-block;background:linear-gradient(135deg,22,z
22);color:z;font-size:0.75rem;font-weight:600;padding:4px 12px;border-radius:999px;margin-bottom:12px">Interactive Tool</span>
<h1 style="font-size:1.875rem;font-weight:800;margin-bottom:8px">z=</h1>
<p style="color:#6b7280;max-width:600px;margin:0 auto">z</p>
</div>
<div style="background:#fff;border:1px solid #e5e7eb;border-radius:16px;overflow:hidden;box-shadow:0 4px 24px rgba(0,0,0,0.06)">
z
</div>
</div>

<footer style="background:#111827;color:#9ca3af;padding:32px 24px;margin-top:48px">
<div style="max-width:1100px;margin:0 auto;text-align:center">
<p style="font-weight:700;color:#fff;margin-bottom:4px">z!</p>
<p style="font-size:0.8rem">#</p>
</div></footer>
</body></html>)	r  r   escaper   r  r   r  r  rb  )r<  r[  r  r  r  html_modr0  r1  r  r  	aug_titleaug_descother_linksr"  r   r  s                   r   r  r    s"   nn_i8G0)<I66*Jii	2&G E51EFIw228b9HK" x66WZZ )FcffX6FGDYtf  -B  CK  CR  CR  SV  S\  S\  Sp  bg  hk  hn  hn  go  `p  Cq  Br  rw  x  xKx
 ""(bGM NUI V	
$ $  $ 	{$ $ !\$"
$ $e$ fmdm$ no$ pyny$ zS$ T^  S_$_$" #$"E#$, FMI-$, NQ-$, R[P[-$, \f-$, gnen-$,oB-$. CL/$.M8/$0 9Az1$0B1$6 		7$6
97$B :DC$BEC$D %IE$D&E$ $r   c                    |j                  dd      }|j                  dd      }|j                  dd      }|j                  dg       }	|j                  dg       }
|j                  d	g       }d
 } ||      \  }}} ||      \  }}}ddddddddddddd}d| d| d| d}d}t        |	      D ]  \  }}|j                  dd      }|j                  ||d         }|dj                  g d| d| d| d| d | d| d| d!| d"| d| d| d#| d| d| d$| d| d| d%| d| d| d&| d| d| d'| d(| d| d| d)| d*|j                  d+d       d,|j                  d-d       d.| d/      z  } d}t        |
      D ]I  \  }}|d0| d| d| d1| d2|j                  d3d       d4| d5| d| d| d6|j                  d7d       d8z  }K d9| d:}|d;z  }d}|D ]  } | j                  d<      xs d=d>   j                         }!|dj                  g d?| d| d| d@| d | d| d| d!| dA| dB| j                  dCd       dD| d| d| dE| d| dF| d| d| dG|! dH| j                  d<d       dI| j                  dJd       dK| dL      z  } dM| dN| dO}"d}#|r	 |j	                  dP      }$t
        j                  j                  |$      rPt        |$dQ      5 }%t        j                  |%j                               j                  dR      }&d d d        dS& dO}"dT}#ndU| dO}"dT}#dV| d| d| dW| dX| d| d| dY}'dZ}(d[| d| d| d\| d| d| d]})dj                  g d^|j                  d<|        d_|j                  d`d       da| db| dc| d| d| dd| d| de|j                  d<|        df|rdgnd dh| d| di| d| d| dj| d| d| dk| d| d| dl|j                  dmdn       do|" dp|# dq|  dr|j                  ds|j                  d<d             dt|j                  du|j                  d`d             dv|j                  dwd       dx| dy|j                  dmdn       dz|) d{|' d||( d}|j                  d~d       d|j                  dd       d|r!|) d|' d|( d|j                  dd       d| d
nd d|r|) d|' d|( d| dnd d|r|) d|' d|( d| dnd dt        |xs g ||       d| d| d|j                  dud       d| d|j                  dmdn       d|j                  d<|        d|j                  d`d       d|j                  d<|        d|  d      S # 1 sw Y   xY w# t        $ r Y w xY w)Nr)  rQ  r+  rR  r-  rS  rN  	faq_itemsrK  c                       j                  d       t               dk(  r d   dz   d   dz  z    d   dz  z    	 t         fddD              S # t        $ r Y yw xY w)	N#r!  r   rR  r   c              3   B   K   | ]  }t        ||d z    d        yw)rR  r  N)r:  )r  r  r  s     r   r  zBgenerate_standalone_site_html.<locals>._hex_rgb.<locals>.<genexpr>  s"     >qQq1Xr*>s   )r   rR  r   )O   F      )r5  r   tupler   )r  s   `r   _hex_rgbz/generate_standalone_site_html.<locals>._hex_rgb  si    HHSMq6Q;!Q1a!A$q&(A	!>I>>> 	! 	!s   A 	AAz<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>z<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>a  <svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>z<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>a  <svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>z<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><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"/></svg>z<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="6"/><circle cx="12" cy="12" r="2"/></svg>z<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>z<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>z<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><polyline points="20 6 9 17 4 12"/></svg>z<svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>a  <svg width="22" height="22" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"/><path d="M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"/><path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"/><path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"/></svg>)shieldchartglobezaprx  starr  clockheartcheckbookrocketzradial-gradient(circle, rgba(r  z ,0.07) 1.5px, transparent 1.5px)r  r  rA  z<div style="background:#ffffff;border-radius:18px;padding:32px 28px 28px;transition:transform 0.25s cubic-bezier(.4,0,.2,1),box-shadow 0.25s cubic-bezier(.4,0,.2,1);border:1px solid rgba(z,0.12);border-top:4px solid zT;box-shadow:0 1px 3px rgba(0,0,0,0.04),0 8px 24px rgba(0,0,0,0.07),0 20px 48px rgba(z:,0.05);position:relative;overflow:hidden;background-image:z;background-size:22px 22px" onmouseover="this.style.transform='translateY(-6px)';this.style.boxShadow='0 2px 4px rgba(0,0,0,0.04),0 16px 40px rgba(0,0,0,0.1),0 32px 64px rgba(z,0.1)'" onmouseout="this.style.transform='';this.style.boxShadow='0 1px 3px rgba(0,0,0,0.04),0 8px 24px rgba(0,0,0,0.07),0 20px 48px rgba(a*  ,0.05)'">
<div style="position:absolute;inset:0;background:linear-gradient(180deg,rgba(255,255,255,0) 30%,rgba(255,255,255,0.97) 100%);pointer-events:none"></div>
<div style="position:relative;z-index:1">
<div style="width:52px;height:52px;border-radius:14px;background:linear-gradient(135deg,rgba(z,0.14),rgba(z,0.06));border:1px solid rgba(zW,0.18);display:flex;align-items:center;justify-content:center;margin-bottom:20px;color:z;box-shadow:0 4px 12px rgba(z,0.15)">z</div>
<h3 style="font-size:1.1rem;font-weight:700;margin-bottom:10px;color:#111827;line-height:1.35;font-family:'Playfair Display',Georgia,serif">r   zI</h3>
<p style="color:#6b7280;font-size:0.9rem;line-height:1.7;margin:0">r   zn</p>
</div>
<div style="position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,z,transparent)"></div>
</div>zi<details style="background:#ffffff;border-radius:14px;padding:0;margin-bottom:10px;border:1px solid rgba(zn,0.1);box-shadow:0 2px 8px rgba(0,0,0,0.05),0 8px 24px rgba(0,0,0,0.04);overflow:hidden;border-left:3px solid z">
<summary style="padding:20px 24px;cursor:pointer;font-weight:600;color:#1f2937;list-style:none;display:flex;justify-content:space-between;align-items:center;gap:12px;font-size:0.975rem">questionz<span style="color:z;font-size:1.3rem;flex-shrink:0;line-height:1;transition:transform 0.2s">+</span></summary>
<div style="padding:0 24px 20px;color:#6b7280;line-height:1.8;font-size:0.9rem;border-top:1px solid rgba(z,0.07)">answerz</div></details>z"<svg width="14" height="14" fill="z" viewBox="0 0 24 24"><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"/></svg>rd  r   Ar   z_<div style="background:#ffffff;border-radius:18px;padding:36px 32px 28px;border:1px solid rgba(z,0.1);border-top:4px solid a  ;background-size:22px 22px">
<div style="position:absolute;inset:0;background:linear-gradient(180deg,rgba(255,255,255,0) 20%,rgba(255,255,255,0.97) 100%);pointer-events:none"></div>
<div style="position:relative;z-index:1">
<div style="font-size:4rem;color:z;opacity:0.15;position:absolute;top:-8px;right:24px;font-family:Georgia,serif;line-height:1">&ldquo;</div>
<p style="color:#374151;font-style:italic;line-height:1.8;margin-bottom:24px;font-size:0.95rem;position:relative;z-index:1">quotezT</p>
<div style="display:flex;align-items:center;gap:14px;border-top:1px solid rgba(zq,0.08);padding-top:20px">
<div style="width:44px;height:44px;border-radius:50%;background:linear-gradient(135deg,z);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:1rem;flex-shrink:0;box-shadow:0 4px 12px rgba(z,0.3)">zH</div>
<div><div style="font-weight:700;color:#111827;font-size:0.9rem">zA</div><div style="color:#9ca3af;font-size:0.8rem;margin-top:2px">r  z@</div></div>
<div style="margin-left:auto;display:flex;gap:2px">z</div>
</div></div></div>zlinear-gradient(135deg, r6  r  r  rbr  zurl(data:image/png;base64,zp<div style="position:absolute;inset:0;background:linear-gradient(135deg,rgba(0,0,0,0.6),rgba(0,0,0,0.3))"></div>zurl(z?display:inline-flex;align-items:center;gap:6px;background:rgba(z,0.08);color:z;font-size:0.72rem;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;padding:6px 14px;border-radius:999px;border:1px solid rgba(z,0.15);margin-bottom:16pxzfont-size:clamp(1.75rem,3.5vw,2.5rem);font-weight:800;color:#111827;line-height:1.2;font-family:'Playfair Display',Georgia,serif;margin-bottom:12pxzL<div style="height:1px;background:linear-gradient(90deg,transparent 5%,rgba(z,0.12) 30%,rgba(z#,0.12) 70%,transparent 95%)"></div>r*  r+  r  a  </title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700;800&family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;color:#1f2937;-webkit-font-smoothing:antialiased;background:#ffffff}
a{color:a  ;text-decoration:none}
details[open] summary span{transform:rotate(45deg);display:inline-block}
.section{padding:96px 24px}
.container{max-width:1100px;margin:0 auto}
.section-label{font-size:0.72rem;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:a  ;margin-bottom:8px}
h1,h2,h3{font-family:'Playfair Display',Georgia,serif}
@keyframes fadeUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}
.fade-up{animation:fadeUp 0.6s ease forwards}
@media(max-width:768px){.grid-2,.grid-3{grid-template-columns:1fr!important}.section{padding:56px 16px}}
</style></head>
<body>
<nav style="background:rgba(255,255,255,0.97);padding:14px 24px;border-bottom:1px solid rgba(aT  ,0.1);position:sticky;top:0;z-index:100;backdrop-filter:blur(12px);box-shadow:0 1px 12px rgba(0,0,0,0.06)">
<div style="max-width:1100px;margin:0 auto;display:flex;justify-content:space-between;align-items:center">
<span style="font-size:1.2rem;font-weight:800;font-family:'Playfair Display',Georgia,serif;background:linear-gradient(135deg,D);-webkit-background-clip:text;-webkit-text-fill-color:transparent">a|  </span>
<div style="display:flex;gap:24px;align-items:center">
<a href="#about" style="color:#6b7280;font-size:0.85rem;font-weight:500;letter-spacing:0.01em">About</a>
<a href="#features" style="color:#6b7280;font-size:0.85rem;font-weight:500;letter-spacing:0.01em">Features</a>
<a href="#faq" style="color:#6b7280;font-size:0.85rem;font-weight:500;letter-spacing:0.01em">FAQ</a>
zR<a href="#tools" style="color:#6b7280;font-size:0.85rem;font-weight:500">Tools</a>z~
<a href="admin.html" style="color:#9ca3af;font-size:0.8rem">&#9881;</a>
<a href="#" style="background:linear-gradient(135deg,zm);color:#fff;padding:9px 22px;border-radius:8px;font-weight:600;font-size:0.85rem;box-shadow:0 4px 12px rgba(z,0.3);transition:transform 0.2s,box-shadow 0.2s" onmouseover="this.style.transform='translateY(-1px)';this.style.boxShadow='0 8px 20px rgba(zR,0.4)'" onmouseout="this.style.transform='';this.style.boxShadow='0 4px 12px rgba(z,0.3)'">cta_textzGet Startedz4</a>
</div></div></nav>

<section style="background:z;background-size:cover;background-position:center;position:relative;color:#fff;padding:128px 24px 100px;text-align:center;min-height:72vh;display:flex;align-items:center">
a  
<div style="position:relative;z-index:1;max-width:820px;margin:0 auto">
<div style="display:inline-flex;align-items:center;gap:8px;background:rgba(255,255,255,0.12);border:1px solid rgba(255,255,255,0.25);color:rgba(255,255,255,0.9);font-size:0.75rem;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;padding:6px 16px;border-radius:999px;margin-bottom:24px;backdrop-filter:blur(4px)">z</div>
<h1 style="font-size:clamp(2.2rem,5.5vw,3.75rem);font-weight:800;margin-bottom:20px;line-height:1.08;font-family:'Playfair Display',Georgia,serif;letter-spacing:-0.01em">headlinezu</h1>
<p style="font-size:clamp(1rem,2.5vw,1.3rem);opacity:0.88;margin-bottom:20px;line-height:1.65;font-weight:400">subheadlinez`</p>
<p style="font-size:1rem;opacity:0.75;max-width:580px;margin:0 auto 36px;line-height:1.75">	hero_bodyz</p>
<div style="display:flex;gap:14px;justify-content:center;flex-wrap:wrap">
<a href="#" style="display:inline-block;background:#fff;color:aX  ;padding:15px 38px;border-radius:10px;font-weight:700;font-size:1rem;box-shadow:0 8px 32px rgba(0,0,0,0.25);transition:transform 0.2s,box-shadow 0.2s" onmouseover="this.style.transform='translateY(-2px)';this.style.boxShadow='0 14px 40px rgba(0,0,0,0.3)'" onmouseout="this.style.transform='';this.style.boxShadow='0 8px 32px rgba(0,0,0,0.25)'">a  </a>
<a href="#about" style="display:inline-block;background:rgba(255,255,255,0.1);color:#fff;padding:15px 38px;border-radius:10px;font-weight:600;font-size:1rem;border:1.5px solid rgba(255,255,255,0.35);backdrop-filter:blur(4px)">Learn More</a>
</div></div></section>

z
<section id="about" class="section" style="background:#ffffff">
<div class="container" style="text-align:center;max-width:780px">
<div style="z">Our Story</div>
<h2 style="z">about_titlezAbout UszR</h2>
<p style="color:#6b7280;font-size:1.05rem;line-height:1.85;margin-top:16px">rJ  z</p>
</div></section>

z
<section id="features" class="section" style="background:linear-gradient(180deg,#f9fafb,#f1f5f9)">
<div class="container">
<div style="text-align:center;margin-bottom:56px">
<div style="z!">What We Offer</div>
<h2 style="z">Everything You Need</h2>
<p style="color:#6b7280;margin-top:14px;font-size:1rem;line-height:1.75;max-width:560px;margin-left:auto;margin-right:auto">offerzw</p>
</div>
<div class="grid-3" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(290px,1fr));gap:28px">r%  r  z
<section class="section" style="background:#ffffff">
<div class="container">
<div style="text-align:center;margin-bottom:56px">
<div style="z ">Testimonials</div>
<h2 style="z">What People Say</h2>
</div>
<div class="grid-3" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:28px">z
<section id="faq" class="section" style="background:linear-gradient(180deg,#f9fafb,#eff6ff)">
<div class="container" style="max-width:720px">
<div style="text-align:center;margin-bottom:48px">
<div style="z">FAQ</div>
<h2 style="z)">Frequently Asked Questions</h2>
</div>
z
</div></section>zD

<section class="section" style="background:linear-gradient(135deg,z 0%,aU   100%);color:#fff;text-align:center;position:relative;overflow:hidden">
<div style="position:absolute;inset:0;background-image:radial-gradient(circle,rgba(255,255,255,0.06) 1.5px,transparent 1.5px);background-size:28px 28px;pointer-events:none"></div>
<div class="container" style="position:relative;z-index:1">
<h2 style="font-size:clamp(1.75rem,3.5vw,2.5rem);font-weight:800;margin-bottom:16px;font-family:'Playfair Display',Georgia,serif">Ready to Get Started?</h2>
<p style="opacity:0.88;margin-bottom:36px;font-size:1.05rem;max-width:500px;margin-left:auto;margin-right:auto;line-height:1.7">zC</p>
<a href="#" style="display:inline-block;background:#fff;color:z;padding:16px 44px;border-radius:10px;font-weight:700;font-size:1.05rem;box-shadow:0 8px 32px rgba(0,0,0,0.2);transition:transform 0.2s" onmouseover="this.style.transform='translateY(-2px)'" onmouseout="this.style.transform=''">a  </a>
</div></section>

<footer style="background:#0f172a;color:#94a3b8;padding:56px 24px 40px">
<div style="max-width:1100px;margin:0 auto">
<div style="display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:32px;padding-bottom:32px;border-bottom:1px solid rgba(255,255,255,0.08)">
<div>
<p style="font-size:1.2rem;font-weight:800;color:#fff;margin-bottom:6px;font-family:'Playfair Display',Georgia,serif">zC</p>
<p style="font-size:0.875rem;max-width:280px;line-height:1.6">a'  </p>
</div>
<div style="display:flex;gap:40px;flex-wrap:wrap">
<div><p style="color:#fff;font-weight:600;font-size:0.8rem;letter-spacing:0.08em;text-transform:uppercase;margin-bottom:12px">Site</p>
<div style="display:flex;flex-direction:column;gap:8px">
<a href="#about" style="color:#94a3b8;font-size:0.875rem;transition:color 0.2s" onmouseover="this.style.color='#fff'" onmouseout="this.style.color='#94a3b8'">About</a>
<a href="#features" style="color:#94a3b8;font-size:0.875rem" onmouseover="this.style.color='#fff'" onmouseout="this.style.color='#94a3b8'">Features</a>
<a href="#faq" style="color:#94a3b8;font-size:0.875rem" onmouseover="this.style.color='#fff'" onmouseout="this.style.color='#94a3b8'">FAQ</a>
</div></div></div></div>
<p style="margin-top:32px;font-size:0.8rem;color:#475569">&copy; z	 &mdash; r-  )r   r  rb  r  r5  r   r   r4  rc  rO  	b64encoder  rb  r   r'  )*r<  r[  r  rC  rF  r  r0  r1  r2  rN  rP  rK  r<  prpgpbsrsgsb	svg_iconsdot_gridfeatures_htmlr  r  icon_keyicon_svgfaq_htmlr  r  	_star_svg_five_starstestimonials_htmltinitialhero_bgoverlayimg_disk_pathimg_fb64_dataeyebrow_style
section_h2dividers*                                             r   r  r    s   nn_i8G0)<I^^NI6F}}Z,H
--R
(C==4L! '"JBB)$JBB u q i u Z n \ B Q ` q tI /rd!B4q<\]HMH% 
Q55(==9V+<= 
 
  Y 
  Z\  Y] 
  ]^ 
  _a  ^b 
  bc 
  df  cg 
  gC 
  DK  CL 
  L` 
  ac  `d 
  de 
  fh  ei 
  ij 
  km  jn 
  nh 
  iq  hr 
  ra	 
  b	d	  a	e	 
  e	f	 
  g	i	  f	j	 
  j	k	 
  l	n	  k	o	 
  o	y 
  z|  y} 
  }~ 
  A  ~B 
  BC 
  DF  CG 
 G^ 
 _a]a
 bc
 dfbf
 gh
 ikgk
 lx
 y{w{
 |}
 ~@  }A
 AB
 CE  BF
 Fd
 eg  dh
 hi
 jl  im
 mn
 oq  nr
 rI
 JQ  IR
 Rn
 oq  nr
 rs
 tv  sw
 wx
 y{  x|
 |D
 EM  DN
NO
 PQ  PU  PU  V]  ^`  Pa  Ob	
bD	

 EFEE-XZD[C\

]c
 dkbk
l
 	

 HS> j4  B  CE  BF  FG  HJ  GK  KL  MO  LP  P~  F  ~G G{ |@  |D  |D  EO  PR  |S  {T  Tg  ho  gp pjjlimmnoqnrrstvsww  AE  AI  AI  JR  SU  AV  @W  Wgj 	jj
 5WI  >L  MIa-K 55='C+113 	 	  "A 	  BD  AE 	  EF 	  GI  FJ 	  JK 	  LN  KO 	  Oj 	  kr  js 	  sG 	  HJ  GK 	  KL 	  MO  LP 	  PQ 	  RT  QU 	  UO 	  PX  OY 	 Y" 	 #*	+}	 ~  ~C  ~C  DK  LN  ~O  }P		PP		
 QSt	
 TU	
 VXTX	
 YZ	
 []Y]	
^X	 Y`W`	 ab	 clal	 my	 z|  y}	 }~	 A  ~B	 BC	 DF  CG	 GN	 OV  NW	WB	 CD%%rBRAS	 TU	 VW  V[  V[  \b  ce  Vf  Ug	g4	 5@=	A	 		 )	I;a@GG	*11#6Mww~~m,-. N%%//

=DDWMHN6xjB M  02 M VVXUYYZ[]Z^^_`b_ccpqxpy  zF  GI  FJ  JK  LN  KO  OP  QS  PT  Tm  nM gJ\]_\``abdaeefgifjjz{}z~~  AC  @D  DE  FH  EI  Il  mGn n  n 			&&!"n #&n ',ii	2&>%?n@
n ngn hofonp^n* _a]a+n* bc+n* dfbf+n* gh+n* ikgk+n*l~+n. F  ~G/n. GH/n. IR  HS/n. SW/n. X]  Xa  Xa  bh  jp  Xq  Wr/n.r/n8 ZbUgi j9n8k69n< 7>Y=n< ?@=n< AJ{=n< Kx=n< y{  x|=n< |}=n< ~@  }A=n< AB=n< CE  BF=n< FR=n< SU  RV=n< VW=n< XZ  W[=n< [\=n< ]_  \`=n< `r=n< su  rv=n< vw=n< xz  w{=n< {|=n< }  |@=n< @H=n< IR  IV  IV  Wa  cp  Iq  Hr=n<r=nB $9CnB%CnD 		EnD
FEnH GM  FNInHNkInJ lu  ly  ly  zD  FK  FO  FO  PV  XZ  F[  l\  k]KnJ]pKnL qzp}p}  L  NS  NW  NW  Xa  ce  Nf  qg  phMnLh\MnN ]f\i\ijuwy\z[{OnN|?OnR @GiSnR H`SnR aj  an  an  oy  {H  aI  `JSnRJSnZ 		[nZ
[n` Oan`anb <cnb cnb $--zBCcnbDMcnd NW]][bdfMgLhendien| % Y  O < } ~G  ~K  ~K  LS  TV  ~W  }X Xllykz {	 +-	.kn|.}nP ) Y  O < ll}k~  /12AnP2Qnd   Y  O < 	
  &()Und)enh $HNGYG HinhICinl DK)mnl LPmnl QZ{mnl[Amnt BK  BO  BO  P]  _a  Bb  Acuntc?unv @Giwnv Hlwnv mv  mz  mz  {E  GT  mU  lVwnvVwwnD x}  xA  xA  BH  JP  xQ  wREnDR?EnF @EyyTV?W>XGnF	YBGnX CH))FTZB[A\YnX ]fYnX gmemYnXnYn nN N  		s*   <X7 3X*4X7 *X4/X7 7	YYc                    t        |      }d}d}|j                  dg       }|j                  dd      }|r#|t        |      k  r||   j                  dd      }|j                  d|      }d|  d	| d
|  d| d| d|rd| dnd d| dS )Nr  rQ  r'  r(  r   r   r)  z<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Sales Letter - aM  </title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#1f2937;background:linear-gradient(135deg,#f0f4ff,#faf5ff);min-height:100vh;padding:40px 20px}
.container{max-width:720px;margin:0 auto;background:#fff;border-radius:20px;padding:56px;box-shadow:0 4px 24px rgba(0,0,0,0.08)}
h1{font-size:1.875rem;font-weight:800;margin-bottom:8px;line-height:1.2}
h2{font-size:1.5rem;font-weight:700;margin:32px 0 12px;color:#1f2937}
h3{font-size:1.25rem;font-weight:600;margin:24px 0 8px;color:#374151}
p{margin-bottom:16px;line-height:1.8;color:#4b5563}
ul,ol{padding-left:24px;margin-bottom:16px}
li{margin-bottom:8px;color:#4b5563;line-height:1.7}
strong{color:#1f2937}
hr{border:none;border-top:1px solid #e5e7eb;margin:32px 0}
blockquote{border-left:4px solid ai  ;padding:16px 24px;margin:24px 0;background:#f9fafb;border-radius:0 8px 8px 0}
blockquote p{color:#374151;font-style:italic;margin:0}
@media(max-width:640px){.container{padding:32px 24px;border-radius:12px}body{padding:16px}}
</style></head>
<body><div class="container">
<div style="border-bottom:2px solid #e5e7eb;padding-bottom:24px;margin-bottom:32px">
<h1>z</h1>
<p style="color:z<;font-size:1.1rem;font-weight:600;margin-bottom:4px">Niche: z</p>
z2<p style="color:#9ca3af;font-size:0.95rem">Brand: z</p>z
</div>
<div class="prose">z</div>
<div style="margin-top:48px;padding-top:24px;border-top:2px solid #e5e7eb;text-align:center">
<p style="color:#9ca3af;font-size:0.85rem">Generated by Aura &mdash; Domain to Business Generator</p>
</div>
</div></body></html>)r9  r   r   )	r<  r]  r  r[  r  r  r0  r{  r|  s	            r   r  r    s    /HJG99Y#D
))M1
%Cc$i#Y]]62.
ii1Gh # $+) , H 	UV[U\ ]JT5j\FZ\ ] ^: 3 r   c                 F   t        |      }d}	|j                  |i       }
|
rZg }|
j                         D ]0  \  }}|j                  d| d| d|j                  d|       d       2 ddj	                  |       d	}	d
| d|  d| d| d| d| d| d| d| d| d|	 d| dS )Nr  r)  .html" style="color:z^;font-size:0.85rem;text-decoration:none;padding:4px 8px;border-radius:4px;background:#f3f4f6">r   </a>zD<div style="margin-bottom:24px;display:flex;flex-wrap:wrap;gap:8px">r  </div>z<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>r+  aL  </title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#1f2937;background:#f8fafc;min-height:100vh}
.container{max-width:780px;margin:0 auto;padding:40px 20px}
.card{background:#fff;border-radius:16px;padding:48px;box-shadow:0 4px 24px rgba(0,0,0,0.06);border:1px solid #e5e7eb}
h1{font-size:1.75rem;font-weight:800;margin-bottom:8px;line-height:1.2}
h2{font-size:1.4rem;font-weight:700;margin:28px 0 12px;color:#1f2937}
h3{font-size:1.15rem;font-weight:600;margin:20px 0 8px;color:#374151}
p{margin-bottom:14px;line-height:1.8;color:#4b5563}
ul,ol{padding-left:24px;margin-bottom:16px}
li{margin-bottom:6px;color:#4b5563;line-height:1.7}
strong{color:#1f2937}
hr{border:none;border-top:1px solid #e5e7eb;margin:28px 0}
blockquote{border-left:4px solid a  ;padding:14px 20px;margin:20px 0;background:#f9fafb;border-radius:0 8px 8px 0}
blockquote p{color:#374151;font-style:italic;margin:0}
table{width:100%;border-collapse:collapse;margin:16px 0}
th,td{border:1px solid #e5e7eb;padding:10px 14px;text-align:left;font-size:0.9rem}
th{background:#f3f4f6;font-weight:600}
@media(max-width:640px){.card{padding:28px 20px;border-radius:12px}.container{padding:16px}}
</style></head>
<body>
<nav style="background:#fff;padding:14px 24px;border-bottom:1px solid #e5e7eb;position:sticky;top:0;z-index:100;backdrop-filter:blur(8px);background:rgba(255,255,255,0.95)">
<div style="max-width:780px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px">
<span style="font-weight:700;background:linear-gradient(135deg,r  rL  a  </span>
<div style="display:flex;gap:16px;align-items:center;flex-wrap:wrap">
<a href="../../index.html" style="color:#6b7280;font-size:0.85rem;font-weight:500;text-decoration:none">&larr; Home</a>
<a href="../../admin.html" style="color:#6b7280;font-size:0.85rem;font-weight:500;text-decoration:none">&#9881; Admin</a>
</div>
</div></nav>
<div class="container">
<div class="card">
<div style="display:flex;align-items:center;gap:10px;margin-bottom:16px">
<span style="background:linear-gradient(135deg,zl);color:#fff;padding:4px 12px;border-radius:6px;font-size:0.75rem;font-weight:600;text-transform:uppercase">z</span>
</div>
<h1>zF</h1>
<div style="height:1px;background:#e5e7eb;margin:20px 0"></div>
z
<div class="prose">z</div>
</div>
<div style="margin-top:32px;text-align:center">
<p style="color:#9ca3af;font-size:0.8rem">Generated by Aura &mdash; Domain to Business Generator</p>
</div>
</div>
</body></html>)r9  r   rk  r  rb  )r<  r  r0  r1  	doc_titledoc_tierdoc_content_mdall_docs_by_tierr  tier_nav_htmlsame_tier_docslinksr#  r$  s                 r   _generate_standalone_doc_htmlry    sb   ~.HM%))(B7N$**, 	FBLL9RD(<WI  Fd  eg  ek  ek  ls  uw  ex  dy  y}  ~  	^_b_g_ghm_n^oouv{#fX # $+) 
,@ AHy)  UY  Zd  Ye 	e0 18y)  Eq  rz  q{ {K  : Q. .r   c
                 x  3 ddl m}
 |j                  dd      }|j                  dd      }|j                  d|       }|j                  dd	      }|r|j                  nd	}|r'|j                  r|j                  j                  d
      nd}t        d |	D              }t        d |	D              }|rt        |      nd}t        |	      }d	}g }|j                  d       t        d |	D              r|j                  d       |j                  d       |xs g D ]D  } |
|j                  |j                        }|j                  d| dd|j                   df       F |rx|j                         D ]e  \  }}|j                  dd      }|j                         j                  dd      }|j                  d| d| dd|j                  d|       df       g |D ]  \  }}}|d| d | d!| d"| d#	z  } d	} g }!|r|j                  nd }"|"rQ|!j                  d$t         j"                  j%                  |"      d%t         j"                  j%                  |"       f       |r|j&                  xs g ng D ]V  }#|#s|!j                  d&t         j"                  j%                  |#      d%t         j"                  j%                  |#       f       X |xs g D ]X  }$|$j                  d't         j"                  j%                  |$j                  d(d	                  }%|!j                  d)|%d*|% f       Z |xs g D ]C  }&|&j(                  xs d+}'|!j                  d,|' |&j*                  d-|' d|&j*                   f       E |!D ]  \  }(})}*| d.|* d/|) d0|( d1|) d2	z  }  d	}+|ri },|j                         D ]:  \  }}|j                  dd      }|,j-                  |g       j                  ||f       < |,j                         D ]  \  }}-|j                         j                  dd      }|+d3| d4| d5| d6t        |-       d7t        |-      d8k7  rd9nd	 d:z  }+|-D ]'  \  }}|+d;| d| d<| d=|j                  d|       d>	z  }+) |+d?z  }+ nd@}+d	}.|rO|D ]I  } |
|j                  |j                        }|.dA|j                   dB|j.                  xs d	 dC| dD| dE	z  }.K ndF}.d	}/t1        |	j3                               D ]  3|	3   }03j5                  d      rdG}1nAt        3fdHdID              rdJ}1n*3j7                  d      rdK}1n3j7                  dL      rdM}1ndN}1t9        |0t:              r|0d4dOn
t=        |0      }2|/dP3 dQ|1 dR|2 d#z  }/ d	j?                  g dS|  dT| d4| dU| dV| dW| dX| dY| dZ| d[|  d\| d]| d^| d_| d4| dU| d`| d4| dU| da| d4| dU| db| d4| dU| dc| dd| r| nde df|+ dg|. dh| di|/ dj| d4| dk      S )lNr   )r  r)  rQ  r+  rR  r   r  r  z	%B %d, %Yr  c              3   D   K   | ]  }|j                  d       sd  yw)r  r   Nr.  r  r  s     r   r  z1generate_standalone_admin_html.<locals>.<genexpr>2  s     PAAJJw<OaP     c              3   L   K   | ]  t        fd dD              sd  yw)c              3   @   K   | ]  }j                  |        y wr  r|  )r  r  r  s     r   r  z;generate_standalone_admin_html.<locals>.<genexpr>.<genexpr>3  s"       APUXC  AP   r  .jpg.jpeg.gif.svg.webpr   N)r  r}  s    @r   r  z1generate_standalone_admin_html.<locals>.<genexpr>3  s4       QQS  AP  ]O  AP  >Pq  Qs   $$)r  z	Main Sitez	&#127968;c              3   &   K   | ]	  }|d k(    yw)r  Nr   r}  s     r   r  z1generate_standalone_admin_html.<locals>.<genexpr>:  s     
>1
>r  )r  zSales Letterz	&#128176;)r  zSite Admin (This Page)z&#9881;r  r  zTool: z&#9889;r  r	  r  r  r
  r  zDoc: r   z	&#128196;zB<tr><td style="padding:10px 14px;border-bottom:1px solid #334155">z
 <a href="z-" style="color:#60a5fa;text-decoration:none">zU</a></td><td style="padding:10px 14px;border-bottom:1px solid #334155;color:#cbd5e1">z
</td></tr>z
Hero Imager  zFeature Imager  r   zGraphics Packr  r  zBrand Kit: r  z<div style="background:#0f172a;border-radius:10px;overflow:hidden;border:1px solid #334155">
<div style="height:140px;overflow:hidden;display:flex;align-items:center;justify-content:center;background:#1e293b"><img src="zB" style="max-width:100%;max-height:140px;object-fit:contain" alt="z" onerror="this.style.display='none';this.parentElement.innerHTML='<span style=\'color:#475569;font-size:2rem\'>&#128444;</span>'"></div>
<div style="padding:10px 12px"><div style="font-size:0.75rem;color:#94a3b8;margin-bottom:2px">zG</div><div style="font-size:0.8rem;color:#e2e8f0;word-break:break-all">z</div></div></div>z<div style="margin-bottom:20px"><div style="display:flex;align-items:center;gap:8px;margin-bottom:12px"><span style="background:linear-gradient(135deg,r  zS);color:#fff;padding:3px 10px;border-radius:5px;font-size:0.75rem;font-weight:600">z4</span><span style="color:#64748b;font-size:0.8rem">z	 documentr   r  z</span></div>z<a href="docs/z.html" style="display:block;background:#0f172a;border:1px solid #334155;border-radius:8px;padding:12px 16px;margin-bottom:6px;text-decoration:none;color:#e2e8f0;font-size:0.9rem;transition:border-color 0.2s" onmouseover="this.style.borderColor='z1'" onmouseout="this.style.borderColor='#334155'">rp  rq  zR<p style="color:#64748b;font-size:0.9rem">No business documents generated yet.</p>a  <div style="background:#0f172a;border:1px solid #334155;border-radius:10px;padding:16px 20px;margin-bottom:8px"><div style="display:flex;justify-content:space-between;align-items:start;gap:12px;flex-wrap:wrap"><div><div style="font-weight:600;color:#e2e8f0;margin-bottom:4px">zC</div><div style="font-size:0.85rem;color:#94a3b8;line-height:1.5">z</div></div><a href="tools/ro  zf;font-size:0.8rem;font-weight:600;text-decoration:none;white-space:nowrap">Open &rarr;</a></div></div>zQ<p style="color:#64748b;font-size:0.9rem">No interactive tools generated yet.</p>HTMLc              3   @   K   | ]  }j                  |        y wr  r|  )r  r  rk  s     r   r  z1generate_standalone_admin_html.<locals>.<genexpr>w  s     c$cr  r  ImageDocumentzassets/AssetOtherz byteszv<tr><td style="padding:8px 12px;border-bottom:1px solid #334155;color:#cbd5e1;font-size:0.8rem;font-family:monospace">za</td><td style="padding:8px 12px;border-bottom:1px solid #334155;color:#94a3b8;font-size:0.8rem">zr</td><td style="padding:8px 12px;border-bottom:1px solid #334155;color:#94a3b8;font-size:0.8rem;text-align:right">z<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Site Admin - a`  </title>
<style>
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;background:#0f172a;color:#e2e8f0;-webkit-font-smoothing:antialiased}
a{color:#60a5fa;text-decoration:none}
.section{padding:48px 24px}
.container{max-width:1100px;margin:0 auto}
.card{background:#1e293b;border:1px solid #334155;border-radius:14px;padding:28px;margin-bottom:20px}
@media(max-width:768px){.grid-gallery{grid-template-columns:repeat(2,1fr)!important}.section{padding:32px 16px}.card{padding:20px}}
@media(max-width:480px){.grid-gallery{grid-template-columns:1fr!important}}
</style></head>
<body>
<nav style="background:#1e293b;padding:14px 24px;border-bottom:1px solid #334155;position:sticky;top:0;z-index:100;backdrop-filter:blur(12px);background:rgba(30,41,59,0.95)">
<div style="max-width:1100px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px">
<div style="display:flex;align-items:center;gap:10px">
<span style="font-size:1.1rem;font-weight:800;background:linear-gradient(135deg,rL  a  </span>
<span style="background:#334155;color:#94a3b8;padding:3px 10px;border-radius:6px;font-size:0.7rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em">Site Admin</span>
</div>
<div style="display:flex;gap:16px;align-items:center;flex-wrap:wrap;font-size:0.8rem">
<a href="#overview" style="color:#94a3b8">Overview</a>
<a href="#pages" style="color:#94a3b8">&#128196; Pages</a>
<a href="#graphics" style="color:#94a3b8">&#127912; Graphics</a>
<a href="#docs" style="color:#94a3b8">&#128203; Docs</a>
<a href="#tools" style="color:#94a3b8">&#9881; Tools</a>
<a href="#manifest" style="color:#94a3b8">&#128193; Files</a>
<a href="index.html" style="color:z;font-weight:600">&larr; View Site</a>
</div>
</div></nav>

<div class="section" id="overview">
<div class="container">
<div class="card" style="background:linear-gradient(135deg,r,  z22);border-color:z44">
<div style="display:flex;justify-content:space-between;align-items:start;flex-wrap:wrap;gap:20px">
<div>
<h1 style="font-size:1.6rem;font-weight:800;margin-bottom:6px">zC</h1>
<p style="color:#94a3b8;font-size:0.95rem;margin-bottom:4px">z7</p>
<p style="color:#64748b;font-size:0.85rem">Niche: z &bull; zI</p>
<p style="color:#475569;font-size:0.8rem;margin-top:8px">Generated: z</p>
</div>
<div style="display:flex;gap:16px;flex-wrap:wrap">
<div style="text-align:center;background:#0f172a;border-radius:10px;padding:14px 20px;min-width:80px"><div style="font-size:1.5rem;font-weight:800;background:linear-gradient(135deg,a  </div><div style="font-size:0.7rem;color:#64748b;text-transform:uppercase">Pages</div></div>
<div style="text-align:center;background:#0f172a;border-radius:10px;padding:14px 20px;min-width:80px"><div style="font-size:1.5rem;font-weight:800;background:linear-gradient(135deg,a  </div><div style="font-size:0.7rem;color:#64748b;text-transform:uppercase">Images</div></div>
<div style="text-align:center;background:#0f172a;border-radius:10px;padding:14px 20px;min-width:80px"><div style="font-size:1.5rem;font-weight:800;background:linear-gradient(135deg,a  </div><div style="font-size:0.7rem;color:#64748b;text-transform:uppercase">Docs</div></div>
<div style="text-align:center;background:#0f172a;border-radius:10px;padding:14px 20px;min-width:80px"><div style="font-size:1.5rem;font-weight:800;background:linear-gradient(135deg,a`  </div><div style="font-size:0.7rem;color:#64748b;text-transform:uppercase">Total Files</div></div>
</div>
</div>
</div>
</div></div>

<div class="section" id="pages" style="padding-top:0">
<div class="container">
<h2 style="font-size:1.3rem;font-weight:700;margin-bottom:16px;display:flex;align-items:center;gap:8px"><span>&#128196;</span> Pages Directory</h2>
<div class="card" style="padding:0;overflow:hidden">
<table style="width:100%;border-collapse:collapse">
<thead><tr style="background:#0f172a"><th style="padding:12px 14px;text-align:left;color:#94a3b8;font-size:0.75rem;text-transform:uppercase;letter-spacing:0.05em;border-bottom:1px solid #334155">Path</th><th style="padding:12px 14px;text-align:left;color:#94a3b8;font-size:0.75rem;text-transform:uppercase;letter-spacing:0.05em;border-bottom:1px solid #334155">Description</th></tr></thead>
<tbody>a  </tbody>
</table>
</div>
</div></div>

<div class="section" id="graphics" style="padding-top:0">
<div class="container">
<h2 style="font-size:1.3rem;font-weight:700;margin-bottom:16px;display:flex;align-items:center;gap:8px"><span>&#127912;</span> Graphics &amp; Images Gallery</h2>
<div class="grid-gallery" style="display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px">
zS<p style="color:#64748b;font-size:0.9rem;grid-column:1/-1">No images available.</p>a  
</div>
</div></div>

<div class="section" id="docs" style="padding-top:0">
<div class="container">
<h2 style="font-size:1.3rem;font-weight:700;margin-bottom:16px;display:flex;align-items:center;gap:8px"><span>&#128203;</span> Business Documents</h2>
<div class="card">a
  </div>
</div></div>

<div class="section" id="tools" style="padding-top:0">
<div class="container">
<h2 style="font-size:1.3rem;font-weight:700;margin-bottom:16px;display:flex;align-items:center;gap:8px"><span>&#9881;</span> Interactive Tools</h2>
<div class="card">a  </div>
</div></div>

<div class="section" id="manifest" style="padding-top:0">
<div class="container">
<h2 style="font-size:1.3rem;font-weight:700;margin-bottom:16px;display:flex;align-items:center;gap:8px"><span>&#128193;</span> Complete File Manifest</h2>
<details style="background:#1e293b;border:1px solid #334155;border-radius:14px;overflow:hidden">
<summary style="padding:16px 20px;cursor:pointer;color:#94a3b8;font-size:0.9rem;font-weight:600">Show all aZ   deployed files</summary>
<div style="overflow-x:auto">
<table style="width:100%;border-collapse:collapse">
<thead><tr style="background:#0f172a"><th style="padding:10px 12px;text-align:left;color:#94a3b8;font-size:0.7rem;text-transform:uppercase;border-bottom:1px solid #334155">File Path</th><th style="padding:10px 12px;text-align:left;color:#94a3b8;font-size:0.7rem;text-transform:uppercase;border-bottom:1px solid #334155">Type</th><th style="padding:10px 12px;text-align:right;color:#94a3b8;font-size:0.7rem;text-transform:uppercase;border-bottom:1px solid #334155">Size</th></tr></thead>
<tbody>z</tbody>
</table>
</div>
</details>
</div></div>

<footer style="background:#0f172a;border-top:1px solid #1e293b;padding:32px 24px;text-align:center">
<p style="color:#475569;font-size:0.75rem">Powered by <span style="background:linear-gradient(135deg,z);-webkit-background-clip:text;-webkit-text-fill-color:transparent;font-weight:700">Aura</span> &mdash; Domain to Business Generator</p>
</footer>
</body></html>) app.mainr  r   rE  r{  r  r  r   r  r  r  r   rk  r  ra  rF  r   r   r  r  ri  r  r4  r   r  r  r.  r   r1  r:  r   rb  )4r<  r[  r  rC  r  r  r  r   r  deployed_files_manifestr  r0  r1  r  r  r]  gen_datetotal_pagestotal_images
total_docsr  
pages_rows	page_listr"  r   r#  r$  r  r%  r   r   r  gallery_html	img_itemsr  fi_urlr&  r'  r(  r@  catr  rel_path	docs_htmldocs_by_tierdoc_list
tools_htmlmanifest_rowsr  ftypesize_strrk  s4                                                      @r   r  r  )  s(   &nn_i8G0)<I66*Jii	2&G #CE7:s~~s~~&&{3SXHP!8PPK  Q"9  Q  QL'4]#!J-.KJI=>

>&=
>>DEHIB RSVVSYY/F4&.&0DiPQR #))+ 	jFB66&),D

,,S#6Ii["U;uRVVGUWEXDY=Z\ghi	j ' KeTZ[_Z``jkojp  q^  _c  ^d  dy  z  y@  @J  K  	K
K LI%(s!!dH,(8(8(BgbggN^N^_gNhMiDjkl033%%+ porww/?/?/G7SUSZSZScScdjSkRlImnop $" IVVJ 0 0r1B CD/21A"/FGHI !&B h  3OKu-s||?PQTPUUVWZWcWcVd=efgh !* GUH  @H  I  IK  LQ  KR R__b^c  dk  lq  kr  rDG 	GG
 I#))+ 	?FB66&),D##D"-44b"X>	? +002 	"ND(

,,S#6I  s  t{  s|  |}  ~G  }H  H[  \`  [a  aU  VY  Zb  Vc  Ud  dm  ux  yA  uB  DE  uE  nq  KM  mN  N[  \  \I" KB~i["  >t  u|  t}  }q  rt  rx  rx  y@  BD  rE  qF  FJ  K  K	K!I	" i	J 	{C 3D  q  ru  r{  r{  q|  |  @C  @O  @O  @U  SU  V  Vq  rv  qw  wK  LS  KT  Tz  {  {J	{ i
M/4467 H%e,>>'"Ec0bccEg&Ei(EE'1#s';c!WF#S  R  SX  RY  Yz  {@  zA  As  t|  s}  }G  H  	HHd d  dHdQd$ RYPY%d$ Z[%d$ \eZe%d$ fj%d$ ku  jv%d$
v#%d8 $+)9d8,<9dD =D9EdD EHEdD IR{EdD SdEdD elclEdDm@EdJ AK|KdJL>KdL ?EXMdLF3MdN 49'OdN :BOdN CJOdNKEOdP FNJQdPOvQdV w~  vWdV @WdV AJ  @KWdV KOWdV P[  O\WdV\vWdX w~  vYdX @YdX AJ  @KYdX KOYdX P\  O]YdX]vYdZ w~  v[dZ @[dZ AJ  @K[dZ KO[dZ PZ  O[[dZ[v[d\ w~  v]d\ @]d\ AJ  @K]d\ KO]d\ P[  O\]d\\]dt 	|udt	udF #x yGdFzGdT +UdTUd` ,ad`kadn lwjwodnxodv 	wdvfwdD gnenEdD opEdD qzozEdD{Ed dr   z/api/export/{domain}/niches-csvc           	        K   |j                  t              j                  t        j                  | k(        j	                         }|r|j
                  st        dd      |j
                  j                  dg       }t        j                         }t        j                  |g d      }|j                          |D ]s  }|j                  D ci c]  }||j                  |d       }}t        |j                  d      t              rd	j!                  |d         |d<   |j#                  |       u t%        t        j&                  |j)                         j+                               d
dd|  di      S c c}w w)Nr  r  r  r  r  r  r  r  r  ztext/csvr  r  z_niches.csv"r  )r   r   r   r<  r   r  r   r   r  r  r  r  r  r  r1  rl  rb  r  r   r  r  r  )	r<  r   ro  r  outputr  rR  r  r  s	            r   api_export_niches_csvr    sE    HHV$++FMMV,CDJJLM 6 64IJJ##''"5F[[]F^^F 0 F
  (.(9(9:1q!%%2,::cgg23T:(,		#6J2K(LC$%	 


6??$++-.&*@(UV  ;s   CE:E5'BE:z#/_dev_admin/{token}/editor/{domain}z/editor/{domain}c                   K   |j                  t              j                  t        j                  |k(        j	                  t        j
                  j                               j                         }|st        dd      ddl	m
} ddlm}m} |j                  xs i } ||j                  xs i       }	 ||	d      \  }	}
 ||d      \  }}|
j                   s|j                   rEt"        j%                  d	| d
t'        |
j                          dt'        |j                          d       |j)                  dd      }|j)                  dg       }|r|t'        |      k  r||   n|dd}|j                  t*              j                  t*        j,                  |j.                  k(        j	                  t*        j
                  j                               j1                  d      j3                         }|j                  t4              j                  t4        j,                  |j.                  k(        j	                  t4        j
                  j                               j3                         }i }|j6                  r|j6                  j9                  d      }t:        j<                  j?                  |      rxt:        j<                  jA                  |      tB        jB                  jE                  t:        j<                  jG                  |            jI                         dd||j6                  <   |jJ                  xs i jM                         D ]  \  }}tO        |tP              s|j)                  d      s)|d   j9                  d      }t:        j<                  j?                  |      s]t:        j<                  jA                  |      tB        jB                  jE                  t:        j<                  jG                  |            jI                         dd||d   <    d}i }|j                  tR              j                  tR        jT                  |k(        j                         }|rh|jV                  xs d}|j                  tX              j                  tX        jZ                  |j.                  k(        j3                         }t]        |      }ddl/m0}m1}m2}m3}m4} i ||jj                  xs i }|jl                  xs i } | j)                  d      s|j6                  r|j6                  | d<   |j)                  dg       }!tn        jq                  di d| d|d|d|d|d |	d!|j6                  d"|jJ                  xs i d#|jr                  xs dd$|jt                  xs d%d&|jv                  xs d'd(ty        |d(d       xs d)d*|d+|d,t{               d-|d.||| d/|||||t}        |j                               |!d0
      S w)1Nr  r  r  r   rA  rC  TrF  z[editor:r  r  r  r(  r'  r  r  r  r  )r  modified_atr4  r   noners  )DEFAULT_ATMOSPHERETEXTURE_CATEGORIESCURSOR_OPTIONSGRADIENT_DIRECTIONSANIMATED_BACKGROUNDSrG  custom_paletteszeditor.htmlr   r<  rs  r[  r  rC  rF  r  rH  rJ  rI  rL  rK  r  r  	revisionsr  r  asset_metadatabrandkit_statuseditor)
rY  r6  rz  r{  rV  texture_categoriescursor_optionsgradient_directionsanimation_stylesr  )@r   r    r   r  r  r{  r  r   r   r\  rB  r]  rD  rE  r[  rC  r  r   r   r   r   r!   r  r  r[  r  r$   rF  r5  r   r   r4  getsizer  fromtimestampgetmtimer  r  rk  r1  rP  r&   r<  ru  r'   rg  rk   r^  r  r  r  r  r  rV  r6  r  r  rH  rJ  rL  r  rS   rl  r  )"r   r<  r   r  rs  rB  rD  rE  r[  rC  rc  rd  r  r'  r  r  r  r  r  r  r  r  r  rY  rq  r  r  r  r  r  r  current_atmospherer6  r  s"                                     r   package_editorr    s     hhw&&w':':f'DENNwOaOaOfOfOhiooqG4VWW6JMMRE$W%6%6%<"=I/	tLI{(DAE<l22hvhk#k6I6I2J1K=Y\]i]q]qYrXs  tI  J  	Kiiq1Oii	2&G/6?SQX\;Y7?+hn{}_~L)001K1Kwzz1YZccdsd~d~  eD  eD  eF  G  M  M  NP  Q  U  U  WIxx ''(:(:gjj(HIRRSZSeSeSjSjSlmqqsHN**11#6	77>>)$ ggooi8'00>>rww?O?OPY?Z[eeg6N7112
 $228b??A gt$U);en++C0Gww~~g&"$''//'":#+#4#4#B#B277CSCST[C\#]#g#g#i"2wu~.	 ON
((8

#
#HOOv$=
>
D
D
FC
**1	XXm,33M4N4NRURXRX4XY]]_
4Z@ E  EM.M73E3E3KM117R  (W-C-C$+$:$:&!ii 126O%%m 676$f6.766+U64?6 	'006 	'006B	6
 	..8&6 	,,?6 	7??0j6 	gg|T:Gi6 	Y6 	H6 	*,6 	.6 	?6 ). F(0(2 !5!:!:!<=*-6  s   MW=W=/3W=#IW=z#/api/editor/{domain}/update-sectionc           
        K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  d      }|j                  d      }|st        dd      t        |j                  xs i       }|j                  |      }t        |t              r|||<   nOt        |t              r:t        |j                  |      t              r||   j                  |       n|||<   n|||<   dd	lm}	  |	|d
      \  }}
|
j$                  r/t&        j)                  d|  dt+        |
j$                         d       ||_        ddlm}  ||d       t1        |j2                  d|dd| |rd|ind d|i      }|j5                  |       |j7                          d|dS 7 w)Nr  r  r  r  r   r  section_key requiredr   )rD  TrF  z[update-section:z] Auto-repaired z issues after editr  rC  r  r  zUpdated r  r  r  r  r   before_datar  r  ru  r  )r/  r   r    r   r  r  r{  r  r   r   r   rP  rC  r1  rl  r  r]  rD  r  r   r   r   r  r  r!   r  r   r   )r<  r   r   r  rs  r  	new_valuerC  beforerD  
val_reportr  r  s                r   api_update_sectionr  X  s    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH((=)K!I4JKKW&&,"-I]];'F)T"!*	+	It	$immK0$7k")))4%.Ik"!*	+:.ydKIz&vh.>s:CUCU?V>WWijk!G7';'
::YKx}%=)/Wf%TY'	C FF3KIIK;77S  s   HH	G3Hz /api/editor/{domain}/add-sectionc           	        K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  d      }|j                  dd      }|st        dd      t        |j                  xs i       }|||<   ||_        d	d
lm}  ||d       t        |j                   d|dd| d|i      }	|j#                  |	       |j%                          d|dS 7 .w)Nr  r  r  r  default_valuer  r  r  r   r  rC  	structurer   zAdded section: r   r  r  r  )r/  r   r    r   r  r  r{  r  r   r   r   rP  rC  r  r  r!   r  r   r   )
r<  r   r   r  rs  r  r  rC  r  r  s
             r   api_add_sectionr    s    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH((=)KHH_b1M4JKKW&&,"-I*Ik!G7';'
::[kOK="A]+C
 FF3KIIK;771  s   EED.Ez#/api/editor/{domain}/remove-sectionc           	        K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  d      }|st        dd      t        |j                  xs i       }|j                  |d       }||_        ddlm}  ||d	       t!        |j"                  d
|dd| d|i      }	|j%                  |	       |j'                          d|dS 7 )w)Nr  r  r  r  r  r  r   r  rC  r  r  zRemoved section: r   r  r  r  r  r   r  r  )ru  removed)r/  r   r    r   r  r  r{  r  r   r   r   rP  rC  r  r  r  r!   r  r   r   )
r<  r   r   r  rs  r  rC  r  r  r  s
             r   api_remove_sectionr    s    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH((=)K4JKKW&&,"-ImmK.G!G7';'
::[k'8%Fg&C
 FF3KIIK{33/  s   ED?D)Ez/api/ai/uploadc                 h  K   dd l }t        j                  dd       g }h d}h d}d}| d d D ]/  }|j                          d {   }t	        |      |kD  r|j                  |j                  d	d
       It        j                  j                  |j                  xs d      d   j                         }||v }	||v }
|	s$|
s"|j                  |j                  d| d
       t        t        j                         dz        }t        j                  dd|j                  xs d      }| d| }d| }t        |d      5 }|j!                  |       d d d        |j                  |d| t	        |      |	rdnd|d}|	rR|dk7  rM|j"                  xs d|j%                  d       } |j&                  |      j)                  d      }||d<   ||d<   |
rz	 |dk(  rF	 ddlm} dd l} | |j0                  |            }d j3                  d! |j4                  D              }n|j)                  dd#$      }t	        |      d%kD  r|d d% d&z   }||d'<   |j                  |       2 d+|iS 7  # 1 sw Y   xY w# t6        $ r d"}Y Pw xY w# t8        $ r}d(t;        |      d d)  d*|d'<   Y d }~\d }~ww xY ww),Nr   zstatic/uploads/aiTr   >   .bmpr  r  r  r  r  >
   .js.py.ts.csv.log.txt.xmlr  .pdf.jsoni  @rh  zFile too large (max 20MB))r   r   r  r   zUnsupported file type: r?  r  r
  r  static/uploads/ai/r#  z/static/uploads/ai/r`  rI  )r   stored_namer   sizer
  r  r  zimage/r  r  rO  mimer  )	PdfReaderr  c              3   D   K   | ]  }|j                         xs d   ywr  N)extract_text)r  pages     r   r  z api_ai_upload.<locals>.<genexpr>  s!     (\t):):)<)B)B(\s    u4   [PDF text extraction unavailable — install PyPDF2]ra  )r  r$  z
[...truncated at 50,000 chars]text_contentz[Error reading file: r2  ]r|  )rO  r   r   r  r   r  r  r   r  r  r:  _timer4  r`  ra  rc  rd  r  r5  rS  rb  PyPDF2r  r  r  rb  pagesImportErrorr   r   )r|  rO  rX  allowed_imgallowed_docmax_sizer  r  r  is_imageis_docr  r  r  r   outentryr  b64r  r  r  r   r   s                           r   api_ai_uploadr    s    KK#d3GDK_KH3BZ 5.w<("NNAJJ9TUVggqzz/R0399;+%#NNAJJ;RSVRW9XYZ$%FF-sAJJ4J(K	Ai[)#K=1$ 	IIg	 JJ&(6L'GZ
 v>>?vcjjo->%?D"&""7+227;C!E(O E&MP&=V4!!*:2::g+>!?#yy(\v||(\\ #>>')>DDt9u$<*LLD(,n% 	uk5n Wm ! 	 	4 ' VUV  P*?At~Q(On%Ps{   AJ2I&C:J2I)BJ2JAI6/JJ2)I3	.J26JJJJ	J/J*%J2*J//J2z/api/ai/uploads/{filename}r  c                    K   t        j                  dd|       }d| }t        j                  j	                  |      st        dd      ddlm}  ||d	| d
dd      S w)Nr  r  r  r  zFile not foundr  r   r  zinline; filename=""nosniff)r  zX-Content-Type-Optionsr  )r`  ra  r   r   r4  r   r  r  )r  r  r   r  s       r   api_serve_ai_uploadr    sj     66$b(3Dv&D77>>$4DEE0%8b#A&/
 s   A A"z/api/editor/{domain}/ai-refinec                 
  K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  dd      }|j                  d      }|j                  dg       }|st        dd	      d}|rg }	|D ]  }
|
j                  d
      dk(  r?|
j                  d      r.|	j                  d|
j                  dd       d|
d   d d         V|
j                  d
      dk(  sk|	j                  d|
j                  dd       d        |	rddj                  |	      z   }t        |j                  xs i       }|j                  xs i }|r|j                  |d      nd}i }|j!                         D ]S  \  }}t#        |t$              rt'        |       d||<   (t#        |t(              r|rt'        |       d||<   L|sOd||<   U |j                  di g      }|r||j                  dd         ni }d}d|  d|j*                   d |j                  d|        d!|j                  d"d       d#t        j,                  |d$%       d|rd&|z   nd' d(|rd)nd d(|r-t#        |t        t$        f      rt        j,                  |d$%      n|r|nd d*| d(| d+}t/        d, |D              }|rd-|d.d/g d.g}|D ]a  }
|
j                  d
      dk(  s|
j                  d0      s*|
j                  d1d2      }|d3   d4   j                  d5d6| d7|
d0    d8d9d:       c |d3   d4   j                  d;|d<       	 dd=lm}  |       }|j4                  j6                  j9                  d>|d?@      }|j:                  d   j<                  j>                  xs d}ntG        dB||      }	 |jI                         }|jK                  dC      rd(|v r|jM                  d(d3      dD   n|dEd  }|jO                  dC      r|d dF jI                         }t        jP                  |      }|j                  dJdG      }|j                  dKd      } d }!|dGk(  r7|r5d4|v r1|j                  |      }!|d4   }"|"||<   ||_        ddLl+m,}#  |#|dM       t[        |j\                  dN||dO| dP|d dQ  |!dR|!ind |dGk(  r|rdR|j                  |      ind ||d dS T	      }$|j_                  |$       |ja                          dU|| |dGk(  r"|j                  ||j                  d4d            nd |dV}%d|v rt#        |d   t$              r|d   |%d<   |%S 7 # t@        $ r0}tB        jE                  dA|        tG        dB||      }Y d }~d }~ww xY w# t         jR                  tT        f$ r
 dG|dHdI}Y ~w xY ww)WNr  r  r  rG  r  r  attachmentsr  zprompt requiredr
  rI  r  z--- Attached Document: r   rS  z ---
 N  r`  [Attached Image: u0    — the user uploaded this as visual reference]z

ATTACHED REFERENCE FILES:
r  z items charspresentr'  r(  r   u  You are Aura, an expert business consultant and brand strategist. You are the user's trusted advisor — nurturing, knowledgeable, and proactive.

YOUR ROLE:
- You understand user INTENT, not just literal words. "Make a logo" means generate a site logo/brand mark. "Add more documents" means create additional content pages.
- Before making changes, briefly acknowledge what currently exists so the user has context.
- If a request is ambiguous or could go multiple directions, present clear options the user can pick from.
- When you DO modify content, return ONLY the refined content (no explanations mixed in).
- Be concise. Guide the user efficiently — consolidate related choices, pre-select sensible defaults, and minimize the number of decisions needed.

RESPONSE FORMAT — you must respond with valid JSON in one of these structures:

1. Direct update (you're confident):
{"action": "update", "content": <the refined content>, "message": "Brief summary of what was changed"}

2. Clarifying question WITH clickable options (PREFERRED when offering choices):
{"action": "clarify", "message": "Brief context about what you're asking", "options": [
  {"label": "A) Short descriptive label", "value": "The full instruction to execute if chosen", "recommended": true},
  {"label": "B) Another option", "value": "The full instruction for this choice"},
  {"label": "C) Yet another", "value": "The full instruction for this choice"}
]}

3. Simple clarify (only when free-form input is truly needed):
{"action": "clarify", "message": "Your question to the user"}

OPTION GUIDELINES:
- ALWAYS use "options" when you have 2-6 discrete choices to offer. This is strongly preferred over listing options in plain text.
- Each option needs "label" (short, starts with A/B/C letter) and "value" (the complete instruction that will be sent back as the user's next prompt).
- Mark ONE option as "recommended": true when there's a clear best choice for the user's niche.
- Keep options to 2-5 choices. If there are more, group them into categories first.
- The "value" should be self-contained so the AI can act on it directly without needing the original context restated.
- Consolidate where possible: instead of asking 3 separate questions, combine related choices into one set of options.

ACTION TYPES:
- "update": You are confident in what to change. Include "content" with the new value and "message" summarizing.
- "clarify": The request is ambiguous, involves non-content changes, or you need more info. Include "options" array when there are discrete choices.

RULES:
- For structured data (features, FAQ, testimonials), "content" must be valid JSON array/object.
- For text sections (headline, about, etc.), "content" must be a plain string.
- If the user asks about visual/design changes (logos, colors, images), use "clarify" to guide them to the Visual Assets or Style & Layout tabs.
- If the user says something vague like "make more documents" or "add pages", use "clarify" with options listing the specific sections/pages that can be added.
- Always be warm, knowledgeable, and specific in your messages.
- When suggesting content directions (e.g., data recovery sections, pricing tiers, feature sets), ALWAYS use the options format so the user can click to choose.zCURRENT PACKAGE STATE:
Domain: z
Niche: z
Brand name: z
Brand tagline: r  z

EXISTING SECTIONS AND SIZES:
rR  r  zTARGET SECTION: z.NO SPECIFIC SECTION TARGETED (general request)r  zCURRENT CONTENT OF TARGET:z

USER REQUEST: zJ

Respond with valid JSON using the format specified in your instructions.c              3   j   K   | ]+  }|j                  d       dk(  xr |j                  d       - ywr
  r`  rO  Nr  r  r  s     r   r  z api_ai_refine.<locals>.<genexpr>x  s.     bQRf 8 LQUU8_ Lb   13r  r  r  rO  r  	image/pngr   r  	image_urldata:;base64,r  r   r  r
  r 	  r   r
  r   r  r  r  )r  r  r  zVision refine error: content_refiner   r  r!  r"  r  zContent updated.)r  r  r<  r  r<  r  rC  	ai_refinezAI r}  r,  r   r1  )	r  r  r  r  r   r  r  	ai_promptai_responser  )ru  r  r<  refinedr  )1r/  r   r    r   r  r  r{  r  r   r   r   r  rb  rP  rC  r[  rk  r1  rl  r   r   rE  r  r  r  r  r7  r8  r9  r;  r<  r  r   r   r   r@   r-  r   r5  r.  r0  r3  r  r  r  r!   r  r   r   )&r<  r   r   r  rs  rG  r  r  attachment_context	doc_textsattrC  r[  current_valuesection_summaryr  r8  ry  selected_brandsystem_promptrefine_prompthas_image_attachmentsmessages_multimodalr  _OAI_clientrl  refined_rawr   r5  r		  r  r<  r  new_contentr  r  response_datas&                                         r   api_ai_refiner	    s    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHHXXh#F((=)K((="-K4EFF	 	CCwwv*,1H  #:37769;U:VV\]`ao]pqwrw]x\y!z{G+  #4SWWVY5O4P  QA  "B  C		C
 !BV[[QZE[![W&&,"-IMMRE6AIMM+r2rMO! +1a$'F86!2OA3A$'F86!2OA!*OA+ 9rd+J@JZ		- ;<PRN*dMX		  /0 1""9b12 3 OA& ' (%0k!6f g h!," 5 6(3
=SWY]R^8_M!$  xCfs  IK  M Mh   ILM$  bVabb-8+
  	Cwwv')cggh.?wwv{3#A&y188'+0hs8}o)NZ`!a: 	 	Ay)00&-1XY	_-fG<<++22L_w{2|D,,q/1199?RK
 ++;]MZb##%e$48GOgmmD!,R0QRQSGE"crl((*Gjj) __Xx0Fooi,GFki;.F{+!),!,	+%;g{+
::[kS6$3<.#A)/);Wf%<Bh<NS^GY]];78dhk%4&8C FF3KIIK QW[cQc9==kooi.LMim"M KJ{9/Et$L#.y#9i O  p  	_LL045./?P]^K	_   ), b!)kN`abs|   XVD7XCX,D
X7X	AXAV! :X	A8W DX!	W*%WXWXX <X?X  Xz$/api/editor/{domain}/update-settingsc           	      P  K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      g }d|v r|d   |_
        |j                  d       d|v r|d   |_        |j                  d       d|v r|d   |_        |j                  d       d|v r|d   |_        |j                  d       d|v sd	|v sd
|v rTt        |j                   xs i       }dD ]  }||v s||   ||<    ||_        ddlm}  ||d       |j                  d       d|v rWddlm}	 t        |j*                  xs i       }
|d   xs i }i |	|
|}||_        ddlm}  ||d       |j                  d       t-        |j.                  ddddj1                  |       |      }|j3                  |       |j5                          d|dS 7 w)Nr  r  r  rH  rJ  rL  r  r)  r+  r-  )r)  r+  r-  r   r  r[  r  rV  )r  settingsr  zUpdated settings: r6  )r  r  r  r   r  r  )ru  changed)r/  r   r    r   r  r  r{  r  r   r   rH  r  rJ  rL  r  rP  r[  r  r  r^  r  rV  r!   r  rb  r   r   )r<  r   r   r  rs  r	  r[  r  r  r  current_atmoincomingmergedr  s                 r   api_update_settingsr!	    s    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHHG$ $_ 5'#N3~&Dy/y!t!,/|$$"3t";~QU?UW]](b)E 	#ADy7a	# ;gw'x t9G..4"5%+C&C,C(C#;g|,|$
::Z(7);(<=C
 FF3KIIKw//[  s   H&H#D-H&CH&z!/api/editor/{domain}/save-palettec                   K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  d      xs dj                         }|st        dd      |j                  dd	      }|j                  d
d	      }|j                  dd	      }t        |j                  xs i       }	t        |	j                  dg             }
|
j                  ||||d       |
|	d<   |	|_        ddlm}  ||d       |j%                          d|
dS 7 dw)Nr  r  r  r   r  r  zPalette name requiredr0  z#000000r1  r2  r  )r   r0  r1  r2  r   r  r[  r  ru  r  )r/  r   r    r   r  r  r{  r  r   r   r   r-  rP  r[  rl  r  r  r  r   )r<  r   r   r  rs  r   r0  r1  r2  r[  palettesr  s               r   api_save_paletter%	    s@    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHHHHV"))+D4KLLhhy),Gi0IXXh	*F$"%EEII/45HOOTgIY_`a'E
GM7'7#IIKx88%  s   E=E:E$E=z+/api/editor/{domain}/delete-palette/{index}indexc                   K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      t        |j                  xs i       }t        |j                  dg             }d|cxk  rt        |      k  rn n|j                  |       ||d<   ||_
        ddlm}  ||d       |j#                          d|d	S w)
Nr  r  r  r  r   r  r[  r  r#	  )r   r    r   r  r  r{  r  r   r   rP  r[  rl  r   r   r  r  r  r   )r<  r&	  r   rs  r[  r$	  r  s          r   api_delete_paletter(	    s     hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH$"%EEII/45HE!CM!U'E
GM7'7#IIKx88s   D
Dz#/api/editor/{domain}/generate-assetc                     !K   	 |j                          d {   }|j                  t              j                  t        j                   k(        j                  t        j                  j                               j                         }|st        dd      |j                  dd      |j                  dd	      t        t        t        |j                  d
d            d      d      |j                  dd      j                  d      !|j                   xs i }|j                  dd      }d}|j                  dg       }|j                  dd      }	|r#|	t#        |      k  r||	   j                  dd      }d|j$                   d| d| d}
dk(  r
|
 d d n6dk(  r
|
 d d n'd k(  r
|
 d! d nd"k(  r
|
 d# d n	|
 d$ d   !fd%}g }t'              D ]  } ||      }|s|j)                  |         |s!rd&nd'}t        d(d)| d*      |j+                  d+ ,       dd-lm} t1        |j2                  xs i       }dk(  xr |j4                   }t7        |      D ]e  \  }} d.t9        j:                         j<                  d d/  }|xr |dk(  }||d0<   |d1   |d2   |d   |d3   |d4   |d5   |d6||<   |s\|d1   |_        g ||_         ||d7       t?        |j@                  d8d9d:t#        |       d; d<d=|D cg c]  }|d1   |d5   d> c}i?      }|jC                  |       |jE                          |D cg c],  }|jG                         D ci c]  \  }}|d@k7  s|| c}}. }}}}dA|dBS 7 # t        $ r t        dd      w xY wc c}w c c}}w c c}}}w w)CNr  zInvalid request bodyr  r  r  rh  rG  rG  r  r   r   r   r  zdall-e-3geminir)  rQ  Businessr'  r(  r   r   z8Create a professional, modern image for a website about z. 
Brand: "zA". Style: Clean, modern, professional. High-quality.
Color hint: z. Do NOT include text or logos.z<
This is a hero banner image - wide, dramatic, atmospheric. 	1536x1024r  z=
This is a section header image - represents the concept of: 	1024x1024featurezL
This is a feature illustration - clean icon-style or conceptual image for: r  zI
This is a seamless background texture - subtle, tileable, professional. r  c                    	 rddl m}m} |v rnd} ||      }nt        d      }|sy j	                  dd       d dt        j                         j                  d d  d	}t        j                  j                  d
d|      }t        |d      5 }|j                  |       d d d        t        j                  j                  |      }d| }	t        j                  j                         j!                         }
|	|
||d| d	S # 1 sw Y   exY w# t"        $ r.}t$        j'                  d| dz    d d d|        Y d }~y d }~ww xY w)Nr   )_generate_image_geminir  rA  graphics_prompt)r  r  r
  r   r  r   r"  r#  r$  F)	r   r
  rG  r{  r  r  
is_primaryr&	  r  zImage generation r   r  z	 failed (r7  )r  r0	  r  rA   ra  r  r  rQ  r   r   rb  rc  rd  r  r  r  r  r   r   r   )r  r0	  r  gemini_model
image_datar  ru  r  r  img_urlr{  r   rh  r   r<  full_promptr  prompt_hintr  
use_geminis               r   _generate_singlez,api_generate_asset.<locals>._generate_singleE  s[   	^(-(;uAY3KN
23DkX\]
 ..c231ZL$**,BRBRSUTUBVAWW[\Hww||HhAHh% $
#$1I'z2G!**113==?J"%('$#
 
$ $   	LL,SUG1UG9UG3qcRS	s6   ,D A'D D)A#D DD 	E"$EEGeminizDALL-Er3  zImage generation failed via z.. Try again with 1 image or a different model.c                     | d   S )Nr&	  r   r^  s    r   r  z$api_generate_asset.<locals>.<lambda>o  s
    qz r   r0  r  r
  r   r2	  r   r
  r{  r  r  )r   r
  rG  r{  r  r  r2	  r  r  r  zAI-generated r  z	 image(s)r"  rf  r  r&	  r  )ru  r"  )$r/  r   r   r   r    r   r  r  r{  r  r   r   r  r  r:  r   r[  r   rE  r9  r  r5  r  r  rP  r  rF  r  r  r  rQ  r!   r  r   r   rk  )"r<  r   r   r  rs  r[  r  r  r{  r|  base_promptr9	  rX  r  r  model_labelr  r  set_heroimg_infoimg_keyr2	  r^  r  r  r8  clean_resultsrh  r   r6	  r  r7	  r  r8	  s"   `                          @@@@@@@r   api_generate_assetrC	    sG    L\\^# hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH,/J((8R(KC!,-q115EHHWj)E!!(+JMMREIIoy9MJ99Y#D
))M1
%Cc$i#Y]]6:6
NwOcOcNd e		 O:>K V$%bcnbop	y	 $%cdocpq	y	 $%rs~r  A	|	#$%op{o|}$R}5 @ G5\ #!!$NN6"#
 ",h(6RS^R_  `N  5O  P  	PLL)L*7..4"5LV#BG,B,B(BH ) 58L$**,"2"22A"6!78(!q&
!+E?V$x("<0"<0 ,$!
W %-e_G"5  *G'+,
::W*s7|nAj\QZ'[U\]PQqxQz]K]^C
 FF3KIIKKRSSaqwwyAtq!ALadASMSm44o $ L4JKKL` ^
 BSsp   ON# N N# G!OCOAO$N=60O&O>OOO	O N# #N::OOOzHero Bannerphoto)rS  r  z	Site Logor?  FaviconrA  zSocial Share (OG)sharezAbout Sectionr  zBackground Texturelayers)rG  r  r  r  about_imager  z&/api/editor/{domain}/set-primary-imagec                   K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  d      |j                  dd      }st        dd      |t        vr1t        dd	d
j                  t        j                                      d}t        fd|D              st        dd      j                  d      }t         j"                  j%                  |      |D cg c]0  }t         j"                  j%                  |j'                  d            2 }	}t        fd|	D              rt         j"                  j)                        st        dd      ddlm}
 t/        |j0                  xs i       }|j                  |      }||<   ||_         |
|d       |dk(  r||j2                  }|_        t/        |j4                  xs i       }|j7                         D ]-  \  }}t9        |t.              s|j                  d      k(  |d<   / ||_         |
|d       t;        |j<                  d|ddt        |   d    d ||d|d      }|j?                  |       |jA                          d|d S 7 c c}w w)!Nr  r  r  r 	  slotrG  r  image_url requiredInvalid slot. Valid: r6  r$  rL  z/static/uploads/c              3   @   K   | ]  }j                  |        y wr  r   r  r  r 	  s     r   r  z(api_set_primary_image.<locals>.<genexpr>       A1y##A&Ar  Invalid image pathr  c              3   @   K   | ]  }j                  |        y wr  rO	  )r  r  	real_paths     r   r  z(api_set_primary_image.<locals>.<genexpr>  s     =1y##A&=r  zImage file not foundr   r  r6  r   r2	  r  r  	designatezDesignated image for rS  r}  rJ	  	old_valuerJ	  r 	  r  r  ru  r2  )!r/  r   r    r   r  r  r{  r  r   r   r   DESIGNATION_SLOTSrb  r  r  r5  r   r   realpathr-  r4  r  r  rP  r6  rF  r  rk  r1  r!   r  r   r   )r<  r   r   r  rs  rJ	  ALLOWED_PREFIXESru  r  allowed_dirsr  r2  rW	  old_heror  r   rv  r  r 	  rT	  s                     @@r   api_set_primary_imager_	    s    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH%I88FF#D4HII$$6KDIIVgVlVlVnLoKp4qrrSA0@AA4HII$H  *I<LMqBGG$$QWWS\2MLM===RWW^^T]E^4JKK7117R8L  &I"L ,G'./v~))!*G228b9$**, 	BHC#t$%(WWU^y%@L!	B ".g/0
::W$*?@QRV@WX_@`?aacdmcn(o!	: y9	C FF3KIIKL99c  & Ns*   K9K1EK95K4CK90BK94K9z'/api/editor/{domain}/remove-designationc                   K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  d      }|r|t        vr1t        dddj                  t        j                                      dd	lm} t!        |j"                  xs i       }|j%                  |d       }||_         ||d
       |dk(  rd |_        t)        |j*                  d|ddt        |   d    ||d|d d      }	|j-                  |	       |j/                          d|dS 7 pw)Nr  r  r  rJ	  r  rL	  r6  r   r  r6  rG  r  undesignatezRemoved designation for rS  rV	  rX	  r  r  rY	  )r/  r   r    r   r  r  r{  r  r   r   r   rZ	  rb  r  r  r  rP  r6  r  rF  r!   r  r   r   )
r<  r   r   r  rs  rJ	  r  r2  rW	  r  s
             r   api_remove_designationrb	    s`    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH88FD4006KDIIVgVlVlVnLoKp4qrr7117R8L  t,I ,G'./v~!%
::W$,DEVW[E\]dEeDf*g!	: t4	C FF3KIIKL997  s   F	FE0F	z!/api/editor/{domain}/designationsc                   K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      t        |j                  xs i       }|j                  d      s|j                  r|j                  |d<   |t        dS w)Nr  r  r  rG  )r2  slots)r   r    r   r  r  r{  r  r   r   rP  r6  r   rF  rZ	  )r<  r   rs  r2  s       r   api_get_designationsre	    s     hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH117R8LF#(>(>&55V(3DEEs   CCz!/api/editor/{domain}/delete-assetc                 D  K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  d      st        dd      d}t        fd|D              st        dd	      d
dlm} t        |j                  xs i       }d }d }	t!        |j#                               D ]3  \  }
}t%        |t              s|j                  d      k(  s,|
}|}	||
=  n |j&                  k(  }|rd |_        ||st        dd      j)                  d      }t*        j,                  j/                  d      }t*        j,                  j/                  |      }d}|j1                  |      r7t*        j,                  j3                  |      r	 t+        j4                  |       d}||_         ||d       t=        |j>                  dddd ||	dd|i      }|jA                  |       |jC                          d||dS 7 U# t6        $ r%}t8        j;                  d| d|        Y d }~d }~ww xY ww)Nr  r  r  r 	  r  rK	  rM	  c              3   @   K   | ]  }j                  |        y wr  rO	  rP	  s     r   r  z#api_delete_asset.<locals>.<genexpr>  rQ	  r  rR	  r   r  r   Asset not found in packager  r   FTzCould not delete file r}  r  r  r  zDeleted asset: )r 	  was_hero
asset_infofile_removedr  r  )ru  ri	  rk	  )"r/  r   r    r   r  r  r{  r  r   r   r   r  r  r  rP  r  rl  rk  r1  rF  r5  r   r   r[	  r   r4  r  r   r   r  r!   r  r   r   )r<  r   r   r  rs  r\	  r  r  deleted_keydeleted_infor   rv  ri	  ru  safe_dirrT	  rk	  r   r  r 	  s                      @r   api_delete_assetro	     sg    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH%I4HIISA0@AA4HII7..4"5LKL++-. Sc4 SWWU^y%@KLS! %%2H!%84PQQ$Hww0H  *ILH%"''..*C	FIIi L *G'+,
::W(yk%B"+Q]^"L1	C FF3KIIK,OOm  N  	FNN3I;bDEE	FsH   J I,DJ /J B4J 9I/ AJ /	J8JJ JJ z$/api/editor/{domain}/set-focal-pointc           	        K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  d      }|j                  dd      }|j                  dd      }|st        dd	      t        d
t        dt        |                  }t        d
t        dt        |                  }ddlm} t!        |j"                  xs i       }	d}
|	j%                         D ]6  \  }}t'        |t               s|j                  d      |k(  s,||d|d<   d}
 n |
st        dd      |	|_         ||d       |j)                          d||ddS 7 w)Nr  r  r  r 	  focal_xr  focal_yr  rK	          r  r   r  Fr   )r  yfocal_pointTrh	  r  r  )ru  ru	  )r/  r   r    r   r  r  r{  r  r   r   r   r  r  rB  r  r  rP  r  rk  r1  r   )r<  r   r   r  rs  r 	  rq	  rr	  r  r  r  r   rv  s                r   api_set_focal_pointrv	  ;  s    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH%Ihhy#&Ghhy#&G4HII#s3g/0G#s3g/0G7..4"5LG &&( Sc4 SWWU^y%@'.W!=CG	 4PQQ)G'+,IIKw+GHH?  s   F>F;E
F>"F>7AF>z!/api/editor/{domain}/upload-assetcustomrh  c           
      R  K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      |j                          d {   }t        j                  j                  |j                        d   xs d}| j                  dd       d| dt        j                          j"                  d d  | }t        j                  j%                  d	d
|      }t'        |d      5 }	|	j)                  |       d d d        d| }
|dk(  r|
|_        n]t-        |j.                  xs i       }|
|dd||dz   t        j                          j"                  d d z   <   ||_        ddlm}  ||d       t5        |j6                  d|dd| d|j                   |
|j                  d      }|j9                  |       |j;                          d|
|dS 7 # 1 sw Y   xY ww)Nr  r  r  r   r  r  r
  r   r   r"  r#  r$  rG  T)r   r
  r  r   r   r  r  r  r  z	Uploaded z image: rf  r  r  )ru  r   rh  )r   r    r   r  r  r{  r  r   r   r  r   r   r  r  ra  r  r  rQ  rb  rc  rd  rF  rP  r  r  r  r!   r  r   r   )r<  rh  r  r   rs  contentsr  r  ru  r  r5	  r  r  r  s                 r   api_upload_assetrz	  _  s    hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHHYY[ H
''

4==
)!
,
6C..c*+1ZL$**,:J:J2A:N9OPSuUHww||Hh9H	h	 	z*GV!(G228b9HOYcqu@vZ#%

(8(8!(<<=!-;g/0
::W*yHT]]O%T">C
 FF3KIIK7*EE3 ! s,   BH'HBH'0HCH'H$ H'z/api/editor/{domain}/historyc                 (  K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      |j                  t              j                  t        j                  |j                  k(        j	                  t        j
                  j                               j                  d      j                         }|D cg c]  }|j                  |j                  |j                  |j                   |j"                  |j$                  r|j$                  d d nd |j&                  r|j&                  d d nd t)        |j$                  xr t+        |j$                        dkD        xs/ t)        |j&                  xr t+        |j&                        dkD        |j
                  r|j
                  j-                         nd d	 c}S c c}w w)Nr  r  r  r,  r2  )	r  r
  r  r  r   r	  r		  has_full_datar{  )r   r    r   r  r  r{  r  r   r   r!   r  r  r[  r  r  r  r  r   r	  r		  r  r   r  )r<  r   rs  r  r^  s        r   api_editor_historyr}	    s    hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH)001K1Kwzz1YZccdsd~d~  eD  eD  eF  G  M  M  NQ  R  V  V  XI   ddAOO((1==*+++Q[[#&4./mmq}}Tc*akkDc!++.>.DEyammNx`cdedqdq`rux`xIy23,,all,,.D   s   D	HC?H
Hz&/api/editor/{domain}/revision/{rev_id}rev_idc                   K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      |j                  t              j                  t        j                  |k(  t        j                  |j                  k(        j                         }|st        dd      |j                  |j                  |j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |j
                  r|j
                  j)                         d
S d d
S w)Nr  r  r  zRevision not found)
r  r
  r  r  r   r	  r		  r  r  r{  )r   r    r   r  r  r{  r  r   r   r!   r  r  r  r  r  r   r	  r		  r  r  r  )r<  r~	  r   rs  r  s        r   api_revision_detailr	    s#    hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH
((?
#
*
*f$""gjj0 eg  4HIIffc//COO**S__]]3??cnn47NNcnn..0 
 IM s   E;E=z/api/augment-typesc                     K   t               S wr  )rS   r   r   r   api_augment_typesr	    s     r  z/api/augments/{domain}c           
        K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      |j                  t              j                  t        j                  |j                  k(        j	                  t        j
                  j                               j                         }|D cg c]c  }|j                  |j                  |j                  |j                  |j                   |j
                  r|j
                  j#                         nd de c}S c c}w w)Nr  r  r  )r  r
  r   r   r   r{  )r   r    r   r  r  r{  r  r   r   r$   r  r  r  r  r   r   r   r  )r<  r   rs  r  r  s        r   api_list_augmentsr	    s    hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHHxx ''(:(:gjj(HIRRSZSeSeSjSjSlmqqsH
 	  ddANNQWW}}23,,all,,.D   s   C:E,<A(E'$E,z/api/augments/{domain}/suggestc                   K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      t        t        j                               d d }t        |d| t        t              dz
  t               t        j!                  t"        ||        || ddS w)	Nr  r  r  r  augment_suggestr   r  r  )r   r    r   r  r  r{  r  r   r   r   r  r  r  r   r  r   r  r  )r<  r   rs  rl  s       r   api_suggest_augmentsr	    s     hhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHHr"Fv(&#6K2Lq2PRgh/@)DDs   C"C$z/api/augments/{domain}/generatec           	        K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  dd      }|j                  dd      }|j                  dd      }|j                  d	d      |j                  d
d      |j                  dd      |j                  dd      d}t        t        j                               d d }	t        |	d| t        t               dz
  t                t"        j%                  t&        |	| ||||       |	| |ddS 7 hw)Nr  r  r  r
  r  r   r  instructionsr  r  r!  r  r  r  )r  r  r  r  r  r  r   r  )rl  r<  r
  ru  )r/  r   r    r   r  r  r{  r  r   r   r   r   r  r  r  r   r  r   r  r  )
r<  r   r   r  rs  r  r   r  r  rl  s
             r   api_generate_augmentr	    sH    Dhhw&&w':':f'DENNwOaOaOfOfOhiooqG4GHH88FK0LHHWb!E((>2688$5r:/15((#3R8HHZ6	O r"Fv)637M3NQR3RTjk0&&,PUWjl{|PYZZ'  s   FE>E(Fz/api/augments/auto-fillc           
        K   | j                   j                  d      }|st        d      i }	 | j                          d{   }t        |j                  dd            t        |j                  dd            t        t        |j                  d	d
            d      }|j                  t              j                  t        j                  j                  d            j                  t        j                  j                               j                         }g }d}|D ]  }|j                  t               j                  t         j"                  |j$                  k(        j'                         }	|	k  r1|	k  r,|j)                  |j*                         t-        |      |k\  s n|dz  } |sdg dd|dS t/        t1        j2                               dd t5        |      D 
cg c]  \  }
}d|
 |d c}}
dddgz   }t7        ddt-        |      |       t9        |      fd}t:        j=                  |       t?        t-              |dt-               dd      S 7 )# t        $ r Y 3w xY wc c}}
w w)z^One-click: find all packages below augment threshold and fill them up via AI suggest+generate.r   r   r   Nr  rR  r  r   r[  r   r  r   r   z/All packages already meet the augment threshold)r<  r   rl  r  
already_okr  r  r  rY  Completeauto_augment_fillzall-domainsc                     g } t              D ]e  \  }}t        	dd| d|dz    dt               d|d| t        d|z  t              z        	       t	        |
      }| j                  |       g t        d
 | D              }t        d | D              }t        d | D              }t        d | D              }t        	dd| d| d| dt              ddt              ||||| d       y )Nr  zProcessing r  r   r  r  r  P   )ru  rv  rx  rw  ry  c              3   J   K   | ]  }|j                  d       dk(  sd  ywr  r  r  r^  s     r   r  zAapi_augments_auto_fill.<locals>._run_auto_fill.<locals>.<genexpr>  s     G1155?h+FQG   ##c              3   J   K   | ]  }|j                  d       dk(  sd  yw)ru  r  r   Nr  r	  s     r   r  zAapi_augments_auto_fill.<locals>._run_auto_fill.<locals>.<genexpr>  s     IAAEE(Oy,HaIr	  c              3   J   K   | ]  }|j                  d       dk(  sd  yw)ru  r   r   Nr  r	  s     r   r  zAapi_augments_auto_fill.<locals>._run_auto_fill.<locals>.<genexpr>  s     F1155?g+EQFr	  c              3   R   K   | ]  }t        |j                  d g              ! yw)r  N)r   r   r	  s     r   r  zAapi_augments_auto_fill.<locals>._run_auto_fill.<locals>.<genexpr>  s      AAQUU62./As   %'r  u	   Done — z domains queued, z augment jobs started, z skippedrY  r,  )domains_processedr  r  r  total_augment_jobsdetails)ru  rv  rx  rw  ry  r  )r  r  r   r:  r  r  r  )rX  r  r<  r0  r  r  r  
total_jobsdomains_snapshotmaster_job_idr  r  s           r   _run_auto_fillz.api_augments_auto_fill.<locals>._run_auto_fill  s1   $%56 	 KC}Y&1&C!G9AcJZF[E\\]$^'*qY$'S37G3H(H$IK .flLQCNN3	  GGGIIIFFFAAA
="+F83DZLPghogppx y#&'7#8$. #034D0EQWdkw}  V`  mt  u	vr   zAuto-fill started for r  )rl  r   r  r	  r<  ) r   r   r   r/  r   r:  r  r   r    r   rC  r  r  r{  r  r  r$   r  r  r   r  r  r   r   r  r  r  r  rl  r   r  r
   )r   r   r   r  	run_limitr  to_fillr	  r  r   r  r  stepsr	  r	  r	  r  r  s                 @@@@r   api_augments_auto_fillr	    sR     "":.H,,D\\^# txx23Ltxx23LC"-.3Ixx ''(9(9(?(?(EFOOPWPbPbPgPgPijnnpHGJ !((););svv)EFLLN<EL$8NN3??+7|y(!OJ LY[gkvw  HR  S  	S

%bq)M6?6HIdaqWq)IU_jtMuLvvE}1=#g,PUVG}v, '#%& +C0@,A+B(K  m $ 0 JsO   ,JI2 I/I2 EJ*AJ+J=A2J/I2 2	I?;J>I??	Jz/augment/{augment_id}r#  c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      t        |j                  xs d      S w)Nr  Augment not foundr  z<p>No content</p>r  )r   r$   r   r  r   r   r	   r  )r#  r   r  s      r   augment_previewr	  '  sY     hhw&&wzzZ'?@FFHG4GHH 4 4 K8KLLs   A-A/z!/site/{domain}/tools/{augment_id}c                   K   |j                  t              j                  t        j                  |k(        j	                  t        j
                  j                               j                         }|st        dd      |j                  t              j                  t        j                  |k(  t        j                  |k(        j                         }|st        dd      |j                  t              j                  t        j                  |k(        j	                  t        j
                        j                         }|j                  xs i }|j                  dd      }|j                  dg       }	|	r|t        |	      k  r|	|   n|dd	}
dd
lm}m} |j                  t$              j                  t$        j&                  |k(        j                         }d}|r,|j(                  r |j(                  xs i j                  dd      } ||j                  dd      |j                  dd      |j                  dd      |j*                  xs d|||j,                        } ||      }t.        j1                  d| ||
|||||d      S w)Nr  r  r  r	  r(  r   r'  r  r  rM  rP  r)  rQ  r+  rR  r-  rS  rT  zaugment_page.html)r   r<  r[  r  r  other_augmentsrZ  r[  )r   r    r   r  r  r{  r  r   r   r$   r  r  r[  r   r   r^  rN  rO  r&   r<  r_  rE  rV  r  r  )r   r<  r#  r   rs  r  r  r[  r  r'  r  rN  rO  rq  rU  rZ  r[  s                    r   augment_page_viewr	  /  s    hhw&&w':':f'DENNwOaOaOfOfOhiooqG4VWWhhw&&wzzZ'?ATATX^A^_eegG4GHH88G$++G,?,?6,IJSST[TfTfgkkmLMMREiiq1Oii	2&G/6?SQX\;Y7?+hn{}_~LL
((8

#
#HOOv$=
>
D
D
FCJ
s{{kk'R,,VR8
!		/95))-y9yy3""(b%%E #5)I%%&9fUlY	<  s   J	Jz/api/augments/{augment_id}c           
        K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      t        |j                  d|j                  dd|j                   |j                  |j                  d      }|j                  |       |j                  |       |j                          d	d
iS w)Nr  r	  r  r  r  zDeleted augment: r  r  ru  r  )r   r$   r   r  r   r   r!   r  r  r   r   r  r   )r#  r   r  r  s       r   api_delete_augmentr	  X  s     hhw&&wzzZ'?@FFHG4GHH
%%Y(('8%H$11GMMJ	C FF3KIIgIIKds   CCc                   K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                         }|st        dd      d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_	        d|v r
|d   |_
        t        |j                  d|j                  d	d
|j                         }|j                  |       |j                          ddiS 7 w)Nr  r	  r  r   r   r   r  r  r  zUpdated augment: )r  r  r  r  r   ru  r  )r/  r   r$   r   r  r   r   r   r   r   r  r!   r  r  r   r   )r#  r   r   r  r  r  s         r   api_update_augmentr	  k  s     Dhhw&&wzzZ'?@FFHG4GHH$W"=14h#N3
%%Y(('8%HC
 FF3KIIKd-  s   C=C;C%C=/sopc                 >   K   t         j                  d| ddd      S w)Nzsop.htmlsopr  r  r  r  rr  s    r   sop_pager	    s"     %%jgW\pr2stt   /architecturec                 >   K   t         j                  d| ddd      S w)Nzarchitecture.htmlarchitecturer  r  r	  rr  s    r   architecture_pager	    s0     %%&9w`n  CE  <F  G  Gr	  z/api/page-metadatac                   )K   ddl m} t        j                  j                         )d })fd}d }i }| j	                  |j                  t        j                              j                         }| j	                  |j                  t        j                              j                         }|xs |}| j	                  t              j                         }	dd ||       ||      |	dd	|d
<   | j	                  |j                  t        j                              j                         }
| j	                  |j                  t        j                              j                         }|
xs |}| j	                  t              j                         }dd ||       ||      |dd	|d<    |d      }dd ||       ||      dd|d<   ddg}|D cg c]
  } ||       }}t        d |D        d       }dd ||       ||      d|D ci c]  }| | ||             c}d|d<    |d      }| j	                  t              j                         }| j	                  |j                  t        j                              j                         }t        t        d ||g      d       }dd  ||       ||      d!|d"|d#<   | j	                  |j                  t        j                              j                         }| j	                  |j                  t        j                              j                         }|xs |}| j	                  t              j                         }| j	                  |j                  t         j                              j                         }| j	                  |j                  t"        j                              j                         }t        t        d ||||g      d       }d$d% ||       ||      ||d&d'|d(<   | j	                  t"              j%                         }t        d) |D        d       }d*d+ ||       ||      t'        |      d,d	|d-<   | j	                  |j                  t(        j                              j                         } | j	                  |j                  t*        j                              j                         }!t        t        d | |!g      d       }"d.d/ ||"       ||"      d0d|d1<   )j-                         d2z   }#)t        j.                  d34      z
  }$g }%|j1                         D ]_  \  }&}'|'j3                  d5      st        j                  j5                  |'d5   j7                  d2            }(|(|$k  sO|%j9                  |&       a |#|t'        |      |%t'        |%      d6d7d8S c c}w c c}w w)9Nr   funcc                 .    | sy | j                         dz   S NrW  r  r6  s    r   fmtzpage_metadata.<locals>.fmt      ||~##r   c                 "   | sy| z
  }|j                         dk  ry|j                         dk  rt        |j                         dz         dS |j                         dk  rt        |j                         dz         dS |j                   dS 	NrS  <   zjust nowi  zm agoQ zh agozd agor  r:  r  r6  deltar  s     r   	age_labelz page_metadata.<locals>.age_label      b 2% 4'%--/2567u== 5(%--/4789??**U##r   c                     	 t         j                   j                  t        j                  j	                  |             S # t
        $ r Y y w xY wr  )r  r  r   r   r  r   )r   s    r   
file_mtimez!page_metadata.<locals>.file_mtime  s?    	$$222773C3CD3IJJ 		s   ;> 	A
	A
/roadmapRoadmapzroadmap_items table)r  rS  last_updatedagerecord_countr  r  /taskszBuild Taskszbuild_tasks tabletaskszapp/templates/sop.htmlr	  zTechnical SOPz!app/templates/sop.html file mtime)r  rS  r	  r	  r  r	  zapp/services/aura.pyzapp/services/blueprint.pyc              3   &   K   | ]	  }|s|  y wr  r   )r  ms     r   r  z page_metadata.<locals>.<genexpr>  s     7qQ7s   r  /promptszPrompt Laboratoryz"aura.py + blueprint.py file mtimes)r  rS  r	  r	  r  source_filespromptszapp/templates/architecture.htmlr	  zArchitecture Mapz&architecture.html mtime + job activity)r  rS  r	  r	  r  packages_countr	  r  	Dashboardz&packages + brandkits + profiles + jobs)r  rS  r	  r	  domain_countr  r  r  c              3   N   K   | ]  }|j                   s|j                     y wr  )r|  r  s     r   r  z page_metadata.<locals>.<genexpr>  s     EqallEs   %%/api/profileszSite Profileszsite_profiles tableprofiles/api/global-contextzContext Enginez(global_context + project_contexts tablescontextrW     )hoursr	  z24 hours)r  stale_pagesstale_countfreshness_threshold)
scanned_atr  r_  )r   r	  r  r  r   r  r%   r|  scalarr{  r   r#   r    r"   r   r   r&   r(   r  r   r*   r)   r  r  rk  r   r  rstripr  )*r   sa_funcr	  r	  r	  r  roadmap_latestroadmap_created
roadmap_tsroadmap_counttasks_latesttasks_createdtasks_tstasks_count	sop_mtimeprompt_filesr  prompt_mtimesprompt_latest
arch_mtimer  
job_latestarch_ts
pkg_latestpkg_createdpkg_tsr	  brandkit_latestprofile_latestdash_tsr	  
profile_ts
ctx_latestproj_latestctx_ts	scan_timestale_thresholdr	  r   metar  r  s*                                            @r   page_metadatar
    s$    *



"
"
$C$

$ EXXgkk+*@*@ABIIKNhhw{{;+A+ABCJJLO2?JHH[)//1MYJ	*0E%1FE) 88GKK	(<(<=>EEGLHHW[[)=)=>?FFHM,}H((9%++-K=Hi.A#/BE'N 34IIy/C5E%L +,GHL,89qZ]9M97M7FM%8M*9]3K68DE1C
1..E	E) =>J!'')I'++cnn56==?J&
J78$GG*<GYw-?:#	E. '++g&8&89:AACJ((7;;w'9'9:;BBDK&;F88F#))+Lhhw{{8+>+>?@GGIOXXgkk+*@*@ABIIKN&TU_cdGkGYw-?$y:	E+ xx$((*HEHEtTJ/J	*0EH1FE* '++m&>&>?@GGIJ((7;;~'@'@ABIIKKz;78$GF%0@FIf,=<E) #%IH..R88OK[[] (	T88N#""00n1E1L1LS1QRBO#""3'	(  u:&{+#-	
	 	y : Fs+   GWW+WWMW!6W:Wz/api/page-metadata/{domain}c                   K   ddl m} t        j                  j                         d }fd}|j	                  t
              j                  t
        j                  | k(        j                  t
        j                  j                               j                         }|s| ddS |j	                  |j                  t        j                              j                  t        j                  |j                  k(        j!                         }|j	                  |j                  t"        j$                              j                  t"        j                  |j                  k(        j!                         }|j	                  t              j                  t        j                  |j                  k(        j'                         }|j	                  t"              j                  t"        j                  |j                  k(        j'                         }	|j	                  t(              j                  t(        j*                  | k(        j                         }
|
r|
j$                  nd }|
rM|j	                  t,              j                  t,        j.                  |
j                  k(        j'                         nd}|j	                  t0              j                  t0        j*                  | k(        j                         }|r|j$                  nd }t        t        d |j$                  |j                  ||||g      d       }| d|j                  |j2                   ||j                         ||j$                         ||j                         ||j$                        d	| ||       ||      d
|	 ||       ||      d
|
r|
j4                  nd| ||       ||      d ||       ||      d ||       ||      d	S w)Nr   r	  c                 .    | sy | j                         dz   S r	  r	  r	  s    r   r	  z!page_metadata_domain.<locals>.fmt  r	  r   c                 "   | sy| z
  }|j                         dk  ry|j                         dk  rt        |j                         dz         dS |j                         dk  rt        |j                         dz         dS |j                   dS r	  r	  r	  s     r   r	  z'page_metadata_domain.<locals>.age_label  r	  r   F)r<  foundr  T)r  r]  r{  r|  age_createdage_updated)r   latestr	  r  )ru  r  r|  r	  )r|  r	  )	r<  r
  rs  r  r  r  r	  content_latestcontent_age)r   r	  r  r  r   r    r   r  r  r{  r  r   r  r!   r  r  r	  r$   r|  r   r&   r<  r'   rg  r)   rE  ru  )r<  r   r	  r	  r	  rs  last_revisionlast_augmentrevision_countr  rq  brandkit_tsbrandkit_asset_countctx
context_tsr
  r  s                   @r   page_metadata_domainr
    s    *



"
"
$C$

$ hhw&&w':':f'DENNwOaOaOfOfOhiooqG 511HHW[[)C)CDELL_MgMgkrkukuMuv}}M88GKK(:(:;<CCGDVDVZaZdZdDdellnLXXo.55o6P6PT[T^T^6^_eegNHHW%,,W-?-?7::-MNTTVM
((8

#
#HOOv$=
>
D
D
FC$'#..TKkn288M299-:T:TX[X^X^:^_eegtu
((>
"
)
).*?*?6*I
J
P
P
RC#&DJG..k:'  N 4**w';';g001g001$W%7%78$W%7%78
  .]9KT]^kTlm+s<7HQZ[gQhi$'cjjV/k*9[3I

 #&j/)J:OPn- 0% s   O1O4z/api/quality-gatesc                 B  K   g }dddg d}	 | j                  t              j                  d      j                         }|d   j	                  | j                  t              j                          d       t        d |D              r|d   j	                  d	       |j	                  |       dddg d}	 t        j                  }|d   j	                  d|        |dkD  rd
|d<   |d   j	                  d       |j	                  |       dddg d}| j                  t              j                  t        j                  dk(        j                         }t        |      dkD  r{|D 	cg c]  }	|	j                   }
}	t        t        |
            t        |
      k(  r!|d   j	                  t        |       d       n5|d   j	                  t        |       d       n|d   j	                  d       |d   j	                  d       |j	                  |       dddg d}|d   j	                  d       |d   j	                  d       |d   j	                  d       |j	                  |       d d!dg d}| j                  t               j                         }|d   j	                  | d"       |d   j	                  d#       |d   j	                  d$       |j	                  |       d%d&dg d}t"        j"                  j%                         t#        j&                  d'(      z
  }| j                  t              j                  t        j(                  |k        j                         }|d   j	                  | d)|d*kD  rd+nd,z          |j	                  |       t        |      }t+        d- |D              }||||z
  ||k(  |d.S # t        $ r0}d
|d<   |d   j	                  dt        |              Y d }~Yd }~ww xY w#  |d   j	                  d       Y xY wc c}	w w)/NzState Persistencez6All job state is stored in the database, not in-memoryT)r   r   passedr	  rd  r	  z jobs tracked in DBc              3   :   K   | ]  }|j                   d k(    yw)r  N)ru  r  r  s     r   r  z quality_gates.<locals>.<genexpr>\  s     3qxx9$3   z'Active jobs found in DB (refresh-proof)Fr
  zDB query failed: zBounded Executionz>Background jobs use bounded ThreadPoolExecutor (max 4 workers)zThreadPoolExecutor max_workers=r  z.Too many workers - risk of resource exhaustionzExecutor configuredzConcurrent Isolationz:Each job has independent tracking, no shared mutable stater  r   z' concurrent jobs, all different domainsz# concurrent jobs (some same-domain)z9No concurrent jobs running (isolation verified by design)zCDB-per-job tracking: each job has own row with independent progresszRefresh Recoveryz4Page refresh reconnects to active job streams via DBz(SSE streams read from DB (not in-memory)z1Job Queue panel loads from /api/jobs on page loadz+Active jobs auto-reconnect SSE on page loadzActionable Feedbackz@Health checks provide per-package pass/fail with clickable linksz) packages available for health validationzA5 checks per package: brand, sections, hero, sales letter, renderz2Links to View Site, Edit Package from health modalzJob Retentionz4Jobs older than 30 days are automatically cleaned upr   r  z jobs older than 30 daysr   z (will be cleaned)r  c              3   ,   K   | ]  }|d    s	d  yw)r
  r   Nr   )r  gs     r   r  z quality_gates.<locals>.<genexpr>  s     1qQx[1r  )r  r
  r  
all_passedgates)r   r"   r[  r  r  r   r  r   r   r   _max_workersr   ru  r   r<  r   r    r  r  r  r{  r  )r   r
  gate_db_persistencer  r   gate_executormax_wgate_isolationrunning_jobsr  r   gate_refreshgate_feedbackr  gate_cleanupr  r  r  r
  s                      r   quality_gatesr'
  S  s    E#6G%)b:Lxx}""1%))+I&--#1D1D1F0GGZ.[\3d33	*112[\ 
LL$%0  BB#4M?))i ''*I%(QR19&+M(#)$++,\] 
LL4  FB $5N88C=''

i(?@DDFL
<1%1218822s7|G,9%,,L0A/BBi-jk9%,,L0A/BBe-fgy!(()de9$$%jk	LL .?u"r3L""#MN""#VW""#PQ	LL2  DF#4M!'')I)##yk1Z$[\)##$gh)##$XY	LL+<r"r3L%%'(*<*<"*EEFxx}##CNNV$;<BBDH""hZ/G#HdlopdpL`vx#yz	LLJE1E11F &.o q  L(-H%I&--0A#a&.JKKL?i ''(=> 3sV   
PBO P6AO> ;A-P(P;IP	O;%O60P6O;;P>PPr	  c                 x   K   ddl m}m}m} ddlm}m}m}m} t        j                  d| |||||||ddd
      S w)Nr   )SYSTEM_PROMPT_ANALYZERSYSTEM_PROMPT_BUILDERSYSTEM_PROMPT_BUILDER_LEGENDARY)rN   rQ   rO   LEGENDARY_SECTION_OVERRIDESzprompts.htmlr	  r  )
r   system_prompt_analyzersystem_prompt_buildersystem_prompt_builder_legendaryr  r<  r  legendary_overridesrz  r{  )r\  r)
  r*
  r+
  app.services.blueprintrN   rQ   rO   r,
  r  r  )r   r)
  r*
  r+
  rN   rQ   rO   r,
  s           r   prompts_pager2
    sI     pp%%n"8!6+J$.(:!R
7 
 
s   8:z	/strategyc                    K   t         j                  d| dd| j                  j                  d      | j                  j                  dd      d      S w)Nstrategy.htmlstrategyr  r   r  Fr   rz  r{  ry  r  )r  r  r   r   rr  s    r   strategy_pager7
    sO     %%o"++J7OO''
E:8  s   AAz+/_dev_admin/N5G4K8fWLY9MrapEkZnw_g/strategyc           	      B   K   t         j                  d| ddddd      S w)Nr4
  r5
  r  
_dev_adminTr6
  r	  rr  s    r   strategy_page_devr:
    s/     %%o"$8  r~  r	  c                    K   |j                  t              j                  t        j                  j	                               j                         }t        j                  d| |ddd      S w)Nzroadmap.htmlr  r  )r   rk  rz  r{  )r   r%   r  r{  r  r  r  r  )r   r   rk  s      r   roadmap_pager<
    sc     HH[!**;+A+A+F+F+HIMMOE%%n'TYkt  IK  7L  M  Ms   A*A,z/api/roadmapc                   K   | j                          d {   }t        |j                  dd      |j                  dd      |j                  dd      d      }|j                  |       |j	                          d|j
                  d	S 7 sw)
Nr   r  r   r  rI  planned)r   r   r  ru  r  ru  r  )r/  r%   r   r   r   r  )r   r   r  r  s       r   add_roadmap_itemr@
    su     Dhhw#HH]B/*g.	D FF4LIIK$''**  s   BB
A4Bz/api/roadmap/{item_id}item_idc                   K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                         }|st        dd      d|v rQ|d   |_        |d   dk(  r0|j                  s$t        j                  j                         |_        n|d   dk7  rd |_        d|v r
|d   |_        d|v r
|d   |_        |j                          ddiS 7 ۭw)	Nr  	Not foundr  ru  r  r   r   r  )r/  r   r%   r   r  r   r   ru  r  r  r  r   r   r   )rA
  r   r   r  r  s        r   update_roadmap_itemrD
    s     D88K '''(ABHHJDK@@48n>V#D,=,= ( 1 1 8 8 :D(^v% $D$']
.IIKd  s   C4C2CC4c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          ddiS w)Nr  rC
  r  ru  r  )r   r%   r   r  r   r   r  r   )rA
  r   r  s      r   delete_roadmap_itemrF
    s`     88K '''(ABHHJDK@@IIdOIIKdr  z/api/context/{domain}c                   K   ddl m} |j                  t              j	                  t        j
                  | k(        j                         } || |      }| |r|j                  ni |r|j                  ng |t        |      dS w)Nr   r  )r<  context_state	event_logr   assembled_chars)
r^  r  r   r)   r   r<  r   rI
  rJ
  r   )r<  r   r  r
  	assembleds        r   api_get_contextrM
    sq     G
((>
"
)
).*?*?6*I
J
P
P
RC+FB7I.1**r&)S]]r&y> s   B Br	  c                 .  K   | j                  t              j                         }|sdi i dS |j                  |j                  xs d|j
                  xs i |j                  xs i |j                  r|j                  j                         dz   dS d dS w)Nr  )master_rulesstyle_prefs
guardrailsrW  )r  rO
  rP
  rQ
  r|  )	r   r*   r   r  rO
  rP
  rQ
  r|  r  )r   gcs     r   api_get_global_contextrS
    s     	-	 	&	&	(B "2RHHee-2~~+mm)r9;bmm--/#5 
 MQ r  c                 :  K   | j                          d {   }|j                  t              j                         }|st               }|j	                  |       d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_        |j                          ddiS 7 w)NrO
  rP
  rQ
  ru  r  )	r/  r   r*   r   r   rO
  rP
  rQ
  r   )r   r   r  rR
  s       r   api_update_global_contextrU
    s     D	-	 	&	&	(B_
r
~.m,t\*IIKd  s   BBBBr	  c                   K   | j                  t              j                  t        j                  j	                         t        j
                        j                         }d|D cg c]  }|j                  |j
                  |j                  |j                  t        |j                        |j                  r%t        |j                  j                  dg             nd|j                  r%t        |j                  j                  di             nd|j                  r|j                  j                         dz   nd d c}iS c c}w w)Nr	  r  r   r<  rW  )r  r   r   r   r   r  depth_countr{  )r   r(   r  r   r  r   r  r  r   r   r  r   r   r   r{  r  r   r	  r  s      r   api_list_profilesrY
  #  s     xx$--k.D.D.I.I.K[M]M]^bbdH   ddAFFAFF1==1<<(>?hhQXX\\*b9:AABs188<<<=q89all,,.4$    s   A#E%CE=	Ez/api/profiles/{slug}r   c           	        K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |j                  |j                  |j                  t        |j                        |j                  |j                  r|j                  j                         dz   nd |j                  r|j                  j                         dz   dS d dS w)Nr  Profile not foundr  rW  )r  r   r   r   r   r   r{  r|  )r   r(   r   r   r   r   r  r   r   r  r   r   r{  r  r|  r   r   rL  s      r   api_get_profiler]
  /  s     hh{#**;+;+;t+CDJJLG4GHHjj',,**$w?Q?Q:R..>E>P>Pg((224s:VZ>E>P>Pg((224s: 
 W[ s   C7C9c                   K   | j                          d {   }|j                  dd      j                         }|st        dd      t	        |      }|j                  t              j                  t        j                  |k(        j                         }|rt        dd| d      |j                  dt                     }t        |      }|rt        dd	|i      t        |||j                  d
d      d|      }|j                  |       |j                          d|j                  |j                  dS 7 &w)Nr   r  r  zProfile name is requiredr  zProfile with slug '' already existsr   validation_errorsr   r   r   r  )ru  r  r   )r/  r   r-  r   rZ   r   r(   r   r   r   rX   r[   r   r   r  )	r   r   r  r   r   r   r   r  rL  s	            r   api_create_profilera
  =  s    D88FB%%'D4NOO4=Dxx$++K,<,<,DEKKMH6I$O_4`aaXXh < >?F$V,F5H&4QRRHH]B/	G FF7OIIK'**gllCC)     D?D<D&D?c                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                          d {   }d|v r
|d   |_        d|v r
|d   |_        d|v r)t        |d         }|rt        dd|i      |d   |_
        |j                          d	d
iS 7 aw)Nr  r[
  r  r   r   r   r  r`
  ru  r  )r   r(   r   r   r   r   r/  r   r   r[   r   r   )r   r   r   rL  r  r  s         r   api_update_profilerd
  V  s     hh{#**;+;+;t+CDJJLG4GHHD~F|"=14(h8C9Lf8UVVhIIKd  s   A&C(C
)A"Cc                 *  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  rt        dd      |j                  |       |j                          ddiS w)Nr  r[
  r  r  z!Cannot delete the default profileru  r  )	r   r(   r   r   r   r   r   r  r   r\
  s      r   api_delete_profilerf
  i  s{     hh{#**;+;+;t+CDJJLG4GHH4WXXIIgIIKds   BBz/api/profiles/importc                   K   | j                          d {   }|j                  dd      j                         }|j                  d      }|r|st        dd      t	        |      }|rt        dd|i      t        |      }|j                  t              j                  t        j                  |k(        j                         }|rP||_        |j                  d|j                        |_        ||_        |j                          d	d
|j                  |dS t        |||j                  dd      d|      }|j!                  |       |j                          d	d|j                  |dS 7 Uw)Nr   r  r   r  z%Both 'name' and 'config' are requiredr  r`
  r   r  r  )ru  r  r  r   r   r   created)r/  r   r-  r   r[   rZ   r   r(   r   r   r   r   r   r   r   r  r   )	r   r   r  r   r   r  r   r   rL  s	            r   api_import_profileri
  u  s;    D88FB%%'DXXhFv4[\\$V,F5H&4QRR4=Dxx$++K,<,<,DEKKMH#xxx7K7KL 
		)8;;PTUUHH]B/VG
 FF7OIIKiwzz4PP/  s   E.E+EE.z/api/profiles/{slug}/exportc                 h  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |j                  |j                  |j                  t        j                  j                         j                         dz   dS w)Nr  r[
  r  rW  )r   r   r   r   r  )r   r(   r   r   r   r   r   r   r   r  r  r  r\
  s      r   api_export_profilerk
    s     hh{#**;+;+;t+CDJJLG4GHH**..((//1;;=C s   B0B2z%/api/profiles/{slug}/discovery-fieldsc                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  j                  dt              }|j                  | |dS w)Nr  r[
  r  discovery_fields)rL  r   rm
  )
r   r(   r   r   r   r   r   r   r]   r   )r   r   rL  fieldss       r   api_get_discovery_fieldsro
    sm     hh{#**;+;+;t+CDJJLG4GHH^^ 24LMF||TvNNs   BBr	  c                    K   |j                  t        j                        j                         j	                         }|rt        t        d |D                    ng }t        j                  d| |ddd      S w)Nc              3   &   K   | ]	  }|d      ywr  r   r  s     r   r  ztasks_page.<locals>.<genexpr>  s     0QAaD0r  z
tasks.htmlr	  r  )r   
list_namesrz  r{  )	r   r#   	list_namedistinctr  r  r   r  r  )r   r   listsrr
  s       r   
tasks_pagerv
    sq     HHY(()22488:E5:0%001J%%lWasz  OQ  5R  S  Ss   A6A8z
/api/tasksc                   K   | j                   j                  dd       }|j                  t              }|r"|j	                  t        j
                  |k(        }t        t        j                  dk(  dft        j                  dk(  dfd      }|j                  t        j
                  |t        j                  t        j                        j                         }i }|D ]  }|j
                  |vrg ||j
                  <   ||j
                     j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                   r|j                   j#                         dz   nd |j$                  r|j$                  j#                         dz   nd |j&                  r|j&                  j#                         dz   nd d		        d
|iS w)Nrl  in_progressr   rs  r   rR  )else_rW  )	r  r   r   ru  r  r  r{  r|  r  ru
  )r  r   r   r#   r   rs
  r   ru  r  r  r  r  r  r   r   r  r{  r  r|  r  )r   r   rs
  r;  status_orderr	  r]  rc  s           r   api_get_tasksr{
    s    $$((6I
AHHY((I56			]	*A.			Y	&*L
 JJy**L):N:NPYP\P\]aacEG 	;;g%#%GAKK ##$$hhAJJall<=LL!,,002S8d<=LL!,,002S8d@AANN446<TX%
 		 Ws   G G"c           
        K   | j                          d {   }|j                  dd      }|j                  t              j	                  t        j
                  |k(        j                         }t        ||j                  dd      |j                  dd      d|j                  dd      |      }|j                  |       |j                          d	|j                  d
S 7 ʭw)Nrs
  Defaultr   r  r   rs  r  rs
  r   r   ru  r  r  r  r?
  )
r/  r   r   r#   r   rs
  r   r   r   r  )r   r   r  rs
  	max_ordertasks         r   api_create_taskr
    s     Di0I#**9+>+>)+KLRRTIhhw#HH]B/*b)D FF4LIIK$''**  s   C#C!CC#z/api/tasks/bulkc                   K   | j                          d {   }|j                  dd      }|j                  dg       }g }t        |      D ]  \  }}t        ||j                  dd      |j                  dd      |j                  dd      |j                  d	d      |
      }|j	                  |       |j                          |j                  |j                          |j                          dt        |      |dS 7 w)Nrs
  r}
  r	  r   r  r   ru  rs  r  r~
  r  )ru  r   ids)
r/  r   r  r#   r   r  r  r  r   r   )	r   r   r  rs
  
tasks_datarh
  r  tdr
  s	            r   api_bulk_create_tasksr
    s     Di0I'2&JG:&  2&&"%}b166(I.VVJ+
 	t

tww  IIKS\'BB#  s   DD C*Dz/api/tasks/{task_id}task_idc                   K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                         }|st        dd      d|v rE|d   |_        |d   dk(  r$t        j                  j                         |_
        n|d   dk(  rd |_
        d|v r
|d   |_        d|v r
|d   |_        d	|v r
|d	   |_        |j                          dd
iS 7 ݭw)Nr  Task not foundr  ru  r  rs  r   r   r  r  )r/  r   r#   r   r  r   r   ru  r  r  r  r   r   r  r   )r
  r   r   r  r
  s        r   api_update_taskr
    s     D88I%%illg&=>DDFD4DEE48n>[( ( 1 1 8 8 :D(^y( $D$']
.TZ(IIKd#  s   C6C4CC6c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          ddiS w)Nr  r
  r  ru  r  )r   r#   r   r  r   r   r  r   )r
  r   r
  s      r   api_delete_taskr
    sa     88I%%illg&=>DDFD4DEEIIdOIIKdr  z/api/tasks/list/{list_name}rs
  c                    K   |j                  t              j                  t        j                  | k(        j	                          |j                          ddiS w)Nru  r  )r   r#   r   rs
  r  r   )rs
  r   s     r   api_delete_task_listr
    sE     HHYy22i?@GGIIIKds   AAz/api/valuation/{domain}c                    K   |j                  t              j                  t        j                  | k(        j	                         }|r|j
                  st        dd      t        | |j
                        }|S w)Nr  r9  r  )r   r   r   r<  r   r  r   rW   )r<  r   ro  r  s       r   api_domain_valuationr
    sb     HHV$++FMMV,CDJJLM 6 64Z[[v}'='=>Ir  z/api/health/validatec                 	  K   ddl m}m}m}m} ddlm} | j                  t              j                         }| j                  t              j                         }g }|D ])  }	 ||	      }
|j                  |
j                                + g }|D ]  } ||      }
d}d}	 |j                  xs i } ||j                  xs i       } ||d      \  }} ||d      \  }}|j                  dd      }|j                  dg       }|r|t!        |      k  r||   n|j"                  dd	}dd
lm}m}  ||j                  dd      |j                  dd      |j                  dd      |j*                  xs d      } ||      }t,        j/                  d      }|j1                  d |j"                  ||||||j2                  |j4                  xs d|j6                  xs d|j8                  xs di ||g        g }g }|j                  xs i }t?        |t@              r?g d}|D ]6  }|j                  |      r|j                  |       &|j                  |       8 |j                  xs i } | j                  dg       }!t!        |!      dkD  }"tC        |j2                        }#tC        |jD                        }$d}%|j2                  r:|j2                  jG                  d      }&tH        jJ                  jM                  |&      }%d|"|"rt!        |!       dndddt!        |      dk(  t!        |       dt!        |      t!        |      z    d|rd d!jO                  |       ndz   dd"|#xr |%|#r|%rd#n|#rd$nd%dd&|$|$rt!        |jD                         d'nd%dd(||s|nd)dg}'|
j                         }(||d*|(d+<   |j"                  |(d,<   |j*                  |(d-<   |jP                  |(d.<   |j4                  xs d|(d/<   ||(d0<   ||(d1<   |'|(d2<   |#|(d3<   |$|(d4<   |j                  |(        tS        d5 |D              tS        d6 |D              z   })tS        d7 |D              tS        d8 |D              z   }*tS        d9 |D              }+|)dk(  xr |+dk(  },|,t!        |      t!        |      |)|*|+d:||d;S # t:        $ r}d}t=        |      }Y d }~d }~ww xY ww)<Nr   )validate_db_packagevalidate_db_analysisrD  rE  rA  Tr  rF  r(  r'  r  rM  r)  rQ  r+  rR  r-  rS  )r0  r1  r2  r]  rW  rG  rI  rK  )r   r<  r[  r  rX  rC  rs  rF  rH  rJ  rL  rY  rZ  r[  r  F)rG  rN  benefitsrJ  rP  rs  rK  rO  r  zBrand identityz optionsMissing)r   r
  r  zSite sectionsz presentz, missing: r6  z
Hero imagezPresent & file existszURL set but file missingzNot generatedzSales letterr  zRender testzTemplate renders OK)r
  r   render_testr  r]  r  rH  sections_presentsections_missingcheckshas_hero_imager  c              3   &   K   | ]	  }|d      ywerror_countNr   r	  s     r   r  z"health_validate.<locals>.<genexpr>  s     @Aq'@r  c              3   &   K   | ]	  }|d      ywr
  r   r	  s     r   r  z"health_validate.<locals>.<genexpr>  s     Fq\]qGWFqr  c              3   &   K   | ]	  }|d      ywwarning_countNr   r	  s     r   r  z"health_validate.<locals>.<genexpr>  s     D?+Dr  c              3   &   K   | ]	  }|d      ywr
  r   r	  s     r   r  z"health_validate.<locals>.<genexpr>  s     Jwbc1_K]Jwr  c              3   f   K   | ])  }|j                  d i       j                  dd      r&d + yw)r
  r
  Tr   Nr  r	  s     r   r  z"health_validate.<locals>.<genexpr>  s-     iAEE-QS<T<X<XYacg<h!is   '11)domains_checkedpackages_checkedtotal_errorstotal_warningsrender_failures)healthyr_  r   r  )*r]  r
  r
  rD  rE  r\  rB  r   r   r  r    r  r  r[  rC  r   r   r  r^  rN  rO  rE  r  get_templaterenderrF  rH  rJ  rL  r   r   r1  rP  r  r(  r5  r   r   r
  rb  r  r  )-r   r
  r
  rD  rE  rB  r   r  domain_reportsr  reportpackage_reportsr  	render_okrender_errorr[  rC  r
  r  r'  r  rN  rO  	_hc_theme_hc_theme_cssri  r   r
  r
  scexpected_sectionsri  r  rX  r  r
  r  hero_file_existsr  r
  
pkg_resultr
  r
  r
  overall_healthys-                                                r   health_validater
  "  s\    uu6hhv""$Gxx $$&HN 0%a(fnn./0 O V+$S)	$	"IIOE,S]]-@bAI-iTJLIq%e>HE1#iiq9Oii	2.G7>?UXY`UaCa7?3pspp  MO  hPLT-		/9=))$5yAyy;&&,"	I /y9M --k:HOO" %#"11!//96 --@1z!=  ( ]] bb$ r( 166#;$++C0$++C0	1 YY_"
"y"5&*	c001 0 01 **11#6I!ww~~i8 &ir]I[H\\dFe  yB  C$4D0E0J./0#6F2GL\H]2]1^^fg  [kmxy}  zC  zC  DT  zU  yV  lW  qs  tu!^-P@P2@EU.  {I\v  O^`#/?ocRURbRbNcMddjKk  FU  V"iW`<f{|
 ^^%
/8<$P
=!$'OO
=!!..
7#&66
< &)&7&7&A6
?#)9
%&)9
%&%
8'5
#$)9
%&z*mV+p @@@3FqapFqCqqLD^DDsJwgvJwGwwNi_iiO"a'@Oq,@O #"7| #H(,.
 "# o  	"Iq6L	"s2   BS
 ER&5J1S
&	S/S<S
SS
z/api/packages/site-audit/runc                 Z  K   ddl m} | j                  t              j	                  t        j
                        j                         }i }| j                  t        j
                  |j                  t        j                              j                  t        j
                        j                         }|D ]
  \  }}|||<    g g g g g g g g g g g d}i }|D ]  }	|	j
                  }
|	j                  xs i }|j                  |
d      }|	j                  }d}|r0|j                  d      }t        j                   j#                  |      }|	j$                  xs d}|	j&                  xs i }t)        |t*              r|j                  dg       ng }|	j,                  xs i }|	j.                  xs i }g }t)        |t*              r:|j1                         D ]'  \  }}t)        |t2              s|j5                  |       ) |	j6                  xs i }i }t)        |t*              r:|j1                         D ]'  \  }}t)        |t*              s|j9                  |       ) |j                  dg       }t)        |t*              r|j                  dg       }t)        |t2              rt;        |      nd}|j                  d	|j                  d
g             }t)        |t*              r|j                  d	g       }t)        |t2              rt;        |      nd}|j                  dg       } t)        | t*              r| j                  dg       } t)        | t2              rt;        |       nd}!|j                  d      rdnd|j                  d      rdndz   |dk\  rdndz   |dk\  rdndz   |!dk\  rdndz   }"|
|	j<                  xs d|	j>                  |	j@                  r|	j@                  jC                         dz   nd|rdn|rdnd|dt;        |      dk\  rdn|rdndt;        |      d|dk\  rdn|dk(  rdnd|dt;        |      dk\  rdn|rdndt;        |      dtE        |      rdndt)        |t*              rt;        |j                  dg             n|rdnddt;        |      dk\  rdn|rdndt;        |      dt;        |      dk\  rdn|rdndt;        |      d|"dk\  rdn|"dk\  rdnd|"|||!dddd }#|#||
<   |s|d!   jG                  |
       n|s|d"   jG                  |
       |s|d#   jG                  |
       n"t;        |      dk  r|d$   jG                  |
       |dk(  r|d%   jG                  |
       n|dk  r|d&   jG                  |
       |s|d'   jG                  |
       |s|d(   jG                  |
       |s|d)   jG                  |
       |s|d*   jG                  |
       |"dk  s
|d+   jG                  |
         |j1                         D $%ci c]  \  }$}%|$t;        |%       }&}$}%tH        jH                  jK                         jC                         dz   t;        |      |&||d,}'| j                  tL              jO                  tL        jP                  d-k(        jS                         }(|(r>tU        jV                  |'      |(_,        tH        jH                  jK                         |(_         n1tM        d-tU        jV                  |'      .      }(| j[                  |(       | j]                          |'S c c}%}$w w)/u   
    Scan all packages and report which site assets are present/missing.
    No LLM involved — pure DB + filesystem check. Stores result in AppSettings.
    Returns the audit report immediately.
    r   r	  )no_herohero_file_missingno_sales_letterthin_sales_letterno_augmentsthin_augmentsno_calculatorsno_reference_libraryno_graphics_packno_force_multiplierthin_site_copyFr  r  r7  rN  r4  rP  rK  rN  r   rJ  r   r!  rR  rW  Nr  url_onlymissing)ru  r   r3  thinpartialr  rh  )rN  rP  rK  )ru  r   r  )
hero_imager(  r  r3  rG  r  force_multiplierrC  )r<  r]  r  r|  rk  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  last_runr  
gap_countsgapsr   site_audit_reportr  )/r   r	  r   r    r  r  r  r$   r   r  group_byrC  r   rF  r5  r   r   r
  r(  r3  r1  rP  rG  r  rk  rl  rm  r  r  r   rE  r  r|  r  r  r  r  r  r,   r   r   r   r/  r  r   r   r   ))r   r	  r  augment_countsaug_rowsr  cntr
  domains_reportr  r<  r
  r'  r  hero_file_okr  r(  r  
calc_specsr  r  
gfx_assets_k_vbiz_boxbiz_docs_tier_k_tier_vrN  feature_countrP  	faq_countrK  testimonial_countsite_copy_score
pkg_reportr  r8  r
  r
  r   s)                                            r   run_site_auditr
    s     +xx ))'*=*=>BBDHNxx++W]]7::-FGPPQXQdQdeiikH$ *S&){#*  "!D N ~2]] b"&&vq1	%% ,I77>>)4L''-2%2/9%/FUYYw+B
''-2%2
c4 ))+ *Bb$'%%b)* ""(bgt$$+MMO - gt,OOG,- 66*b)h%||J3H)3Hd)CHff["&&"34c4 ''+r*C *3 5CH1	vvnb1lD)'++NB?L1;L$1OC-UV &&$Q!&&/Qq*1$Q!- q.Qa) $q(Qa	1 	 %%+ ..>Ann#..224s:RV '3dxU^%
 '*,&73&>d|Vaj .!
 '01nd	UV9\e&
 '**o&:dj^g _ 
 '+7mdAKGUYAZSZ!<=fmabst&
 '**o&:dj^g _"
 '*(mr&9dX	[d ]%
 '6&:doabNbhq,$1((9;&,

Z ",vO""6*$%,,V4"#**62$$%,,V4>&&v.]!((0!"))&1'(//7#$++F3&'..v6Q!"))&1}~2@ )-

51!SV)5J5%%,,.88:S@h- !F hh{#**;??>Q+QRXXZG

6*%..557"5TZZ=OP
wIIKM% 6s'   G \+#A\+?N\+*\+\%D\+z/api/packages/site-audit/reportc                    K   | j                  t              j                  t        j                  dk(        j	                         }|r|j
                  sd di i i dS t        j                  |j
                        S w)Nr
  r   r
  r  )r   r   s     r   get_site_audit_reportr
  O  sa     hh{#**;??>Q+QRXXZG'-- ARQS`bcc::gmm$$s   A9A;z/api/legendary-scan/{domain}c                   K   ddl m} ddlm} |j	                  t
              j                  t
        j                  | k(        j                  t
        j                  j                               j                         }|sd|  | dS |j                  r:t        |j                  t              r  |t        |j                              |_        |j	                  t              j                  t        j                   | k(        j                         }|rM|j	                  t"              j                  t"        j$                  |j&                  k(        j)                         ng }|j	                  t*              j                  t*        j                   | k(        j                         }d }|rB|j,                  r6t        |j,                  t              r|j,                  j/                  dg       } |||||      }	|	S w)Nr   scan_packagerA  zNo package found for )r   r<  rU  rs  	brand_kitr  context_keywords)app.services.legendary_scannerr
  r\  rB  r   r    r   r  r  r{  r  r   rC  r1  rP  r&   r<  r'   rg  r  r  r)   rI
  r   )
r<  r   r
  rB  rs  rq  r  r
  ctx_keywordsr  s
             r   legendary_scanr
  W  sz    ;6hhw&&w':':f'DENNwOaOaOfOfOhiooqG09VLLZ(9(94@0g6G6G1HI
((8

#
#HOOv$=
>
D
D
FC_b-(//0J0Jcff0TUYY[hjJ
((>
"
)
).*?*?6*I
J
P
P
RCL
s  Z0A0A4%H((,,Z<#%	F Ms   G6G8z/api/legendary-scanc                   K   ddl m} ddlm} | j	                  t
              j                  t
        j                  j                               j                         }g }|D ]  }	 |j                  r:t        |j                  t              r  |t        |j                              |_
        | j	                  t              j                  t        j                  |j                   k(        j#                         }|rM| j	                  t$              j                  t$        j&                  |j(                  k(        j                         ng }| j	                  t*              j                  t*        j                  |j                   k(        j#                         }d }	|rB|j,                  r6t        |j,                  t              r|j,                  j/                  dg       }	 |||||	      }
|j1                  |j                   |
d   |
d   |
d   |
d	   j3                         D ci c]  \  }}||d
   |d   d c}}|
d   d d d        |j9                  d d       |r't;        t=        d |D              t?        |      z        nd}t=        d |D              }t?        |      |||dS c c}}w # t4        $ r4}|j1                  |j                   ddt7        |      d       Y d }~d }~ww xY ww)Nr   r
  rA  rU  r
  overall_scoreoverall_ratingr_  r  ratingr!  )r
  r!  r  r!  )r<  r!  r
  r_  r  top_suggestionsr   )r<  r!  r
  r   c                 &    | j                  dd      S )Nr!  r   r  r<	  s    r   r  z$legendary_scan_all.<locals>.<lambda>  s    quuWa0 r   Tr  c              3   @   K   | ]  }|j                  d d        yw)r!  r   Nr  r	  s     r   r  z%legendary_scan_all.<locals>.<genexpr>  s     =!%%+=s   c              3   J   K   | ]  }|j                  d       dk(  sd  yw)r
  r%  r   Nr  r	  s     r   r  z%legendary_scan_all.<locals>.<genexpr>  s     Oh;0N!Or	  )r  average_scorelegendary_countr  ) r
  r
  r\  rB  r   r    r  r{  r  r  rC  r1  rP  r&   r   r<  r  r   r'   rg  r  r)   rI
  r   r  rk  r   r   r5  r  r  r   )r   r
  rB  r  rX  rs  rq  r  r
  r
  r  r  r8  r   rO  r
  s                   r   legendary_scan_allr
  t  s    ;6xx ))'*<*<*A*A*CDHHJHG l	l  Z0A0A4%H$8g>O>O9P$Q!((8$++HOOw?R?R,RSYY[Cgj-0778R8RVYV\V\8\]aacprJ((>*11.2G2G7K^K^2^_eegCLs((Z8I8I4-P"0044ZD!!+!-	F NN!--0 !12!),[abn[o[u[u[wxSWSTVWqQx[1W:"NNx#)-#8!#< 'l< LL0$L?QXc=W==GLM^_IOWOOO g,"*	  y  	lNNg&9&9AQXcfghcijkk	lsD   A#K2&F;J2!J,7J2A$K2,J22	K/;)K*$K2*K//K2z/advisorc           
        K   |j                  t              j                  t        j                  j	                               j                         }|j                  t              j                  t        j                  j	                               j                         }t        j                  d| ||t        ddd      S w)Nzadvisor.htmladvisorr  )r   conceptsbatch_plansstatusesrz  r{  )
r   r-   r  r{  r  r  r/   r  r  rs   )r   r   r
  r
  s       r   advisor_pager
    s     xx ))'*<*<*A*A*CDHHJH((9%..y/C/C/H/H/JKOOQK%%n"$!R7  s   B>C z/api/advisor/conceptsc                   K   | j                          d {   }|j                  dd      j                         }|st        dd      |j                  d|d d       }|j                  d      }t	        |      }d }|rd	d
lm}  |||      }t        ||d|j                  dd      |j                  d      |||d|j                  dg             }	|j                  |	       |j                          |	j                         S 7 w)N	raw_inputr  r  zConcept text is requiredr  r   r,  r<  r   rH
  capturedsource_typer  	source_idr
  projectrL  )r   r  ru  r  r  r<  context_snapshotrL  )r/  r   r-  r   rl   r^  r  r-   r   r   r  )
r   r   r  r  r   r<  advisor_ctxproject_ctxr  concepts
             r   api_create_conceptr    s     Db)//1I4NOOHHWio.EXXhF'+KKK1&"=HH]H5((;'%0[IXXfb!	G FF7OIIK??5  s   DDC.Dc                 n  K   |j                  t              }| j                  j                  d      }|r"|j	                  t        j
                  |k(        }| j                  j                  d      }|r"|j	                  t        j                  |k(        }| j                  j                  d      }|r"|j	                  t        j                  |k(        }|j                  t        j                  j                               j                         }d|D cg c]  }|j                          c}iS c c}w w)Nru  r  r<  r
  )r   r-   r  r   r   ru  r  r<  r  r{  r  r  r  )r   r   r;  ru  r  r<  r
  r   s           r   api_list_conceptsr    s     
A!!%%h/FHHW^^v-.!!%%m4FHHW((F23!!%%h/FHHW^^v-.zz',,113488:Hh77887s   DD5D0,	D5z"/api/advisor/concepts/{concept_id}
concept_idc                 2  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         }|j                  D cg c]  }|j                          c}|d<   |S c c}w w)Nr  Concept not foundr  r  )r   r-   r   r  r   r   r  r  r  r   r
  r  r^  s        r   api_get_conceptr    sz     hhw&&wzzZ'?@FFHG4GHH__F070A0AB1199;BF;M Cs   A1B3B
Bc                 D  K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                         }|st        dd      d|v r|d   t        v r
|d   |_        d|v r
|d   |_	        d|v r
|d   |_
        d|v r
|d   |_        d|v r
|d   |_        |j                  d	      r.t        |j                  d	d	|d	   i
      }|j                  |       |j!                          |j#                         S 7 w)Nr  r  r  ru  r   r  rL  r<  note)r  r  r  )r/  r   r-   r   r  r   r   rs   ru  r   r  rL  r<  r   r.   r   r   r  )r  r   r   r  r
  r  s         r   api_update_conceptr    s    Dhhw&&wzzZ'?@FFHG4GHH4DN.>>h$Wd -~F|4hxxzz T&\*

 	sIIK??-  s   D DDD c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          ddiS w)Nr  r  r  rg  T)r   r-   r   r  r   r   r  r   )r  r   r
  s      r   api_delete_conceptr     sb     hhw&&wzzZ'?@FFHG4GHHIIgIIKtr  c           
         t               }	 t        | ddddt        j                  j                         t        j                  j                                |j	                  t
              j                  t
        j                  |k(        j                         }|s t        | dd       	 |j                          y t        | d	d
dt        j                  j                                t        |      }d}|j                  rddlm}  ||j                  |      }t        | dddt        j                  j                                t        |j                  |j                   ||      }t#        d|      }	 t%        j&                  |      }	t3        |j                  d|	||r|d d nd d      }|j5                  |       d|_        |j9                          t        | ddd d!|	t        j                  j                         "       |j                          y # t$        j(                  $ r| |j+                         }
|
j-                  d      rd|
v r|
j/                  dd      d   n|
dd  }
|
j1                  d      r|
d d }
t%        j&                  |
j+                               }	Y w xY w# t:        $ rF}t<        j?                  d#|        t        | dd$tA        |       tA        |      %       Y d }~d }~ww xY w# |j                          w xY w)&Nr  Loading conceptrQ  rd  ru  rv  rw  ry  rz  r  r  r  rQ  Assembling contextr	  r\  rv  rw  ry  r  r  r   rH
  zAI analyzing conceptrV  r  r
  r   r  r   r!  r"  r  r1  r  r  r  r  r  r  r  rZ  rY  r,  ru  rv  rw  ry  r  r  zAdvisor analyze job failed: r  r  )!r   r  r  r  r   r-   r   r  r   r   rl   r<  r^  r  rm   r   r  r@   r/  r0  r3  r-  r   r5  r.  r.   r   ru  r   r   r   r   r   )rl  r  r   r
  r  r	  r  rG  r  r  r5  r  r   s                r   run_advisor_analyze_jobr     s   	B16):K^d !h.?.?.F.F.HZbZkZkZrZrZt	v ((7#**7::+CDJJLvh6IJT 	
Q 	6(<ygi#+#4#4#;#;#=	?+B/>>O5gnnbIK6(>Q^mo#+#4#4#;#;#=	?&w}}g6G6GVab'(:FC	3zz(+H zz$)4WbUdAShlm	
 	s#
		6+<Obl #H8CTCTC[C[C]	_ 	
3 ## 	3nn&G!!%(7;w'--a03GTUTVK&!#2,zz'--/2H	3*  [3A3786(73q6(9KSVWXSYZZ[ 	
sW   BJ% ;B8J% 4H 	A9J% BJ"J% !J""J% %	K4.<K/*K7 /K44K7 7L	z*/api/advisor/concepts/{concept_id}/analyzec                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      t        t        j                               d d }t        |d|j                  d d t        t              t               t        j                  t        ||        d|iS w)Nr  r  r  r  advisor_analyzer  rl  )r   r-   r   r  r   r   r   r  r  r  r   r   rp   r   r  r  r  r   r
  rl  s       r   api_analyze_conceptr#  G   s     hhw&&wzzZ'?@FFHG4GHHr"Fv('--*<cBW>XZop/Dfr  c           
      *   t               }	 t        | ddddt        j                  j                         t        j                  j                                |j	                  t
              j                  t
        j                  |k(        j                         }|s t        | dd       	 |j                          y |j	                  t              j                  t        j                  |k(  t        j                  d	k(        j                  t        j                  j                               j                         }|r|j                   ni }t        | d
ddt        j                  j                                t#        |      }d}|j$                  rddlm}  ||j$                  |      }t        | dddt        j                  j                                t+        |j,                  |j.                  |||      }	t1        d|	      }
	 t3        j4                  |
      }t        |j                  d|d|i      }|jA                  |       d|_!        |jE                          t        | ddd d!|t        j                  j                         "       |j                          y # t2        j6                  $ r| |
j9                         }|j;                  d      rd|v r|j=                  dd      d   n|dd  }|j?                  d      r|d d }t3        j4                  |j9                               }Y w xY w# tF        $ rF}tH        jK                  d#|        t        | dd$tM        |       tM        |      %       Y d }~d }~ww xY w# |j                          w xY w)&Nr  r  rQ  rd  r  r  r  rQ  r  r  r	  r\  r  r  r   rH
  zAI generating planai_planr  r
  r   r  r   r!  r"  planr
  r  r>
  r  zPlan completerY  r,  r  zAdvisor plan job failed: r  r  )'r   r  r  r  r   r-   r   r  r   r   r.   r  r  r  r{  r  r  rl   r<  r^  r  rn   r   r  r@   r/  r0  r3  r-  r   r5  r.  r   ru  r   r   r   r   r   )rl  r  r   r
  analysis_revr  r  r	  r  rG  r  r&  r5  r  r   s                  r   run_advisor_plan_jobr(  R   s   	B86):K^d !h.?.?.F.F.HZbZkZkZrZrZt	v ((7#**7::+CDJJLvh6IJb 	
_ xx077&&*4))Z7
 (?--224
5eeg 	
 ,8<''R6(<ygi#+#4#4#;#;#=	?+B/>>O5gnnbIK6(<ygi#+#4#4#;#;#=	?"7=='2C2CX{\gh'(:FC	/::h'D zz '5	
 	s"
		6+O^h #Dx?P?P?W?W?Y	[ 	
3 ## 	/nn&G!!%(7;w'--a03GTUTVK&!#2,::gmmo.D	/*  [0456(73q6(9KSVWXSYZZ[ 	
sW   BL. ;E	L. J A1L. BL+'L. *L++L. .	M=7<M83N  8M==N   Nz'/api/advisor/concepts/{concept_id}/planc                   K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      t        t        j                               d d }t        |d|j                  d d t        t              t               t        j                  t        ||        d|iS w)Nr  r  r  r  advisor_planr  rl  )r   r-   r   r  r   r   r   r  r  r  r   r   rq   r   r  r(  r"  s       r   api_plan_conceptr+     s     hhw&&wzzZ'?@FFHG4GHHr"Fv~w}}Sb'93?Q;RTfg,fjAfr  z)/api/advisor/concepts/{concept_id}/exportc                 T  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         }|j                  D cg c]  }|j                          c}|d<   t        |dd|  di      S c c}w w)	Nr  r  r  r  r  zattachment; filename=concept_r  r  )	r   r-   r   r  r   r   r  r  r
   r  s        r   api_export_conceptr-     s     hhw&&wzzZ'?@FFHG4GHH__F070A0AB1199;BF;)>B_`j_kkp@q(rss Cs   A1B(3B#
B(z/api/advisor/importc                   K   | j                          d {   }t        |j                  dd      |j                  dd      |j                  dd      d|j                  d      |j                  d	      |j                  d
g             }|j                  |       |j	                          |j                  dg       D ][  }t        |j                  |j                  dd      |j                  di       |j                  d	            }|j                  |       ] |j                          |j                         S 7 &w)Nr   zImported conceptr  r  ru  r  importr<  r  rL  )r   r  ru  r  r<  r  rL  r  r  r  r  r  )	r/  r-   r   r   r  r.   r  r   r  )r   r   r  r
  rev_datar  s         r   api_import_conceptr1     s    Dhhw 23((;+xx*-xx!"45XXfb!G FF7OHHJHH["- zz",,?LLB/%\\*<=	
 	s IIK??+  rb
  concept_idsbatch_plan_idc           
      L   t               }	 t        | ddddt        j                  j                         t        j                  j                                |j	                  t
              j                  t
        j                  j                  |            j                         }|s t        | dd       	 |j                          y t        | d	d
dt        j                  j                                t        |      }i }|D ]  }|j	                  t              j                  t        j                  |j                  k(  t        j                  dk(        j                  t        j                   j#                               j%                         }|s|j&                  ||j                  <    |D cg c]&  }|j                  |j(                  |j*                  d( }	}t        | dddt        j                  j                                t-        |	||      }
t/        d|
      }	 t1        j2                  |      }|j	                  t>              j                  t>        j                  |k(        j%                         }|rk||_         |jC                  d|j(                        |_        |jC                  d      |_"        |jC                  d      |_#        d|_$        |jK                          t        | dddd|t        j                  j                                 |j                          y c c}w # t0        j4                  $ r| |j7                         }|j9                  d      rd|v r|j;                  dd      d   n|dd  }|j=                  d      r|d d }t1        j2                  |j7                               }Y w xY w# tL        $ rF}tN        jQ                  d!|        t        | dd"tS        |       tS        |      #       Y d }~d }~ww xY w# |j                          w xY w)$Nr  zLoading conceptsrQ  rd  r  r  zNo concepts foundrQ  r  r	  r\  r  r  )r  r   r  zAI synthesizing batch planai_batchr  r
  r   r  r   r!  r"  batch_titledependency_graphparallel_tracksr  r  zBatch plan completerY  r,  r  zAdvisor batch job failed: r  r  )*r   r  r  r  r   r-   r   r  r  r  r   rl   r.   r  r  r  r{  r  r   r  r   r  ro   r@   r/  r0  r3  r-  r   r5  r.  r/   plan_contentr   r7  r8  ru  r   r   r   r   r   )rl  r2  r3  r   r
  r  analysesr   r  concept_dictsrG  r  batch_resultr5  
batch_planr   s                   r   run_advisor_batch_jobr>     sm   	B76):L_e !h.?.?.F.F.HZbZkZkZrZrZt	v 88G$++GJJNN;,GHLLNvh6IJ` 	
] 	6(<ygi#+#4#4#;#;#=	?+B/ 	-A((?+22**add2--; h116689%%'  !$	- \ddVWqwwQ[[Qdd6(DWapr#+#4#4#;#;#=	?#M8[I'(:FC	7::h/L XXi(//	0MNTTV
&2J#+//z?O?OPJ*6*:*:;M*NJ')5)9)9:K)LJ& 'JIIK6+<Qdn #LxGXGXG_G_Ga	c 	
C e ## 	7nn&G!!%(7;w'--a03GTUTVK&!#2,::gmmo6L	7(  [1!566(73q6(9KSVWXSYZZ[ 	
sp   B)N? C
N? N? 1+L(AN? $L- 9CN? (N? -BN<8N? ;N<<N? ?	P<P	P 	PP P#z/api/advisor/batchc                 p  K   | j                          d {   }|j                  dg       }t        |      dk  rt        dd      |j	                  t
              j                  t
        j                  j                  |            j                         }t        |      dk  rt        dd      t        |j                  ddd	j                  d
 |d d D                     d      }|j                  |       |j                          |D ]  }|j                  j                  |        |j!                          t#        t%        j&                               d d }t)        |ddt        t*              t*               t,        j/                  t0        |||j                         ||j                  dS 7 w)Nr2  rR  r  z)Need at least 2 concepts for a batch planr  zNot enough valid concepts foundr   zBatch plan: r6  c              3   :   K   | ]  }|j                   d d   y w)Nr   )r   )r  r   s     r   r  z!api_batch_plan.<locals>.<genexpr>!  s     8\!"8\r
  r!  r  )r   ru  r  advisor_batchz
Batch plan)rl  r3  )r/  r   r   r   r   r-   r   r  r  r  r/   rb  r   r  r
  r  r   r   r  r  r  rr   r   r  r>  )r   r   r  r2  r
  r=  r   rl  s           r   api_batch_planrB     s`    D((="-K
;!4_``xx ''

{(CDHHJH
8}q4UVVhhw,tyy8\xXZYZ|8\/\.] ^_J FF:HHJ &""1%&IIKr"Fvc:M6NPcd-v{JMMRz}}==+  s   F6F3FF6z/api/advisor/batch/{batch_id}c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                         S w)Nr  zBatch plan not foundr  )r   r/   r   r  r   r   r  )r   r   batchs      r   api_get_batch_planrE  !  sN     HHY&&y||x'?@FFHE4JKK==?rE  z/_dev_admin/{token}/deployc                 ~   K   | t         k7  rt        d      d|j                  d<   t        ||       d {   S 7 w)Nr  r   r<  r   )r  r   r   deploy_page)r  r   r   s      r   dev_deploy_pagerH  !  s;     "",,"0GOOJWb))))s   4=;=z/deployc                   K   |j                  t              j                  t        j                        j	                         }|j                  t
              j	                         }|j                  t              j                  t        j                  j                               j                  d      j	                         }|j                  t              j                  t        j                        j	                         }|j                  t              j	                         }|D ch c]  }|j                   }}t        j                  d| |||||ddd      S c c}w w)Nr  zdeploy.htmldeployr  )r   r	  bindingslogsr   domain_has_packagerz  r{  )r   r0   r  r{  r  r1   r2   r  r[  r   r<  r    r  r  r  )	r   r   r	  rK  rL  r   r  r  rM  s	            r   rG  rG  $!  s    xx
#,,Z-B-BCGGIHxx)*..0H88M"++M,D,D,I,I,KLRRSUVZZ\Dhhv''6::<Gxx $$&H19:A!--::%%m0 B6   ;s   D(E#*E=&E#z/api/ftp/profilesc                   K   | j                          d {   }dD ]#  }|j                  |      rt        d| d       t        |d   |d   |j                  dd      |d	   t	        |d
         |j                  dd      |j                  dd      |j                  dd            }|j                  |       |j                          |j                         S 7 ŭw)N)rS  hostr   r  r  z is requiredr  rS  rO  port   r   r  	base_pathr  protocolsftpr   F)rS  rO  rP  r   encrypted_passwordrR  rS  r   )r/  r   r   r0   rt   r   r   r  )r   r   r  r  rL  s        r   api_create_ftp_profilerV  7!  s     D: PxxC5'8NOOP 7m&\XXfb!j!+D,<=((;,*f-88L%0	G FF7OIIK??!  s   CCCB+Cc                    K   | j                  t              j                  t        j                        j	                         }d|D cg c]  }|j                          c}iS c c}w w)Nr	  )r   r0   r  r{  r  r  rX
  s      r   api_list_ftp_profilesrX  L!  sM     xx
#,,Z-B-BCGGIHh77887s   AA(A#	A(z/api/ftp/profiles/{profile_id}
profile_idc                   K   |j                          d {   }|j                  t              j                  t        j                  | k(        j                         }|st        dd      d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_	        d|v r
|d   |_
        d|v r|d   rt        |d         |_        d	|v r
|d	   |_        d
|v r
|d
   |_        d|v r
|d   |_        |j!                          |j#                         S 7 w)Nr  r[
  r  rS  rO  rP  r   r  rR  rS  r   )r/  r   r0   r   r  r   r   rS  rO  rP  r   rt   rU  rR  rS  r   r   r  )rY  r   r   r  rL  s        r   api_update_ftp_profiler[  R!  s    Dhhz"))*--:*EFLLNG4GHH$W~F|~F|T
+Td:.%5d:6F%G"d -T
+t!,/IIK??+  s   DDC5Dc                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          ddiS w)Nr  r[
  r  rg  T)r   r0   r   r  r   r   r  r   )rY  r   rL  s      r   api_delete_ftp_profiler]  l!  sb     hhz"))*--:*EFLLNG4GHHIIgIIKtr  z%/api/ftp/test-connection/{profile_id}c                 `  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      t        |j                        }t        |j                  |j                  |j                  ||j                  |j                        }|S w)Nr  r[
  r  )r   r0   r   r  r   r   ru   rU  rv   rO  rP  r   rS  rR  )rY  r   rL  r  r  s        r   api_test_ftp_connectionr_  v!  s     hhz"))*--:*EFLLNG4GHH : :;H w||W=M=MxY`YiYikrk|k|}FMs   B,B.z/api/ftp/bindingsc           	        K   | j                          d {   }|j                  d      }|j                  d      }|r|st        dd      |j                  t              j                  t        j                  |k(  t        j                  |k(        j                         }|rb|j                  d|j                        |_	        |j                  d|j                        |_
        |j                          |j                         S t	        |||j                  dd|       |j                  dd	      
      }|j                  |       |j                          |j                         S 7 Tw)Nftp_profile_idr<  r  z&ftp_profile_id and domain are requiredr  target_directoryr   r  T)ra  r<  rb  r   )r/  r   r   r   r1   r   r<  ra  r   rb  r   r   r  r   )r   r   r  rY  r<  r   bindings          r   api_create_ftp_bindingrd  !  s1    D*+JXXhFV4\]]xx)*11  F*((J6 eg  $(HH-?AZAZ$[!"hh|X5H5HI
		!!!"4&lC88L$/	G FF7OIIK??-  s   E-E*EE-c                   K   | j                   j                  d      }|j                  t              }|r"|j	                  t        j
                  |k(        }|j                         }d|D cg c]  }|j                          c}iS c c}w w)Nr<  rK  )r  r   r   r1   r   r<  r  r  )r   r   r<  r;  rK  bs         r   api_list_ftp_bindingsrg  !  sr     !!%%h/F
"#AHH&--78uuwHh77887s   A*B,B	Bz/api/ftp/bindings/{binding_id}
binding_idc                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          ddiS w)Nr  zBinding not foundr  rg  T)r   r1   r   r  r   r   r  r   )rh  r   rc  s      r   api_delete_ftp_bindingrj  !  sf     hh()001B1E1E1STZZ\G4GHHIIgIIKtr  rb  c           
      (
    t               	 t         ddddt        j                  j                         t        j                  j                                j	                  t
              j                  t
        j                  |k(        j                         }|s t         dd       	 j                          y t        ||d	t        j                  j                         
      j                         j                          t         dddt        j                  j                                t        |      }|sad_        d_        t        j                  j                         _        j                          t         dd       	 j                          y t#        |      _        j                          t         dddt        j                  j                                t'        |j(                        }t*        j,                  j/                  |j0                  |j3                  d            j5                  dd      } fd}t         dddt        j                  j                                |j6                  dk(  r0t9        |j:                  |j<                  |j>                  ||||      }	n:tA        |j:                  |j<                  |j>                  ||j6                  |||      }	d_        |	_!        t        j                  j                         _        jD                  rAj                   r5tG        j                   jD                  z
  jI                               _%        j                          t         dddd|	|dt        j                  j                                j                          y # tL        $ r'}
tN        jQ                  d | d!|
        	 j	                  t              j                  t        jR                  |k(  t        j                  d	k(        jU                  t        jV                  jY                               j                         rJd_        t[        |
      _        t        j                  j                         _        j                          n# tL        $ r Y nw xY wt         dd"t[        |
       t[        |
      #       Y d }
~
=d }
~
ww xY w# j                          w xY w)$Nr  zPreparing deploymentrQ  rd  r  r  FTP profile not foundrQ  r~  )ra  r<  ru  rz  zCollecting filescollectr^  r  zNo files to deployzConnecting to serverr   r   r  \c                     dt        d| z  t        |d      z        z   }t        d| d|t        j                  j	                                | _        j                          y )Nr   A   r   
Uploading r  r  )r:  r  r  r  r  files_uploadedr   )r  r  r  r  r   
deploy_logrl  s       r   r  z'run_ftp_deploy_job.<locals>.progress_cb!  s]    s2=3ua=899Cvj
,CV^$'9J9J9Q9Q9SU(0J%IIKr   zUploading filesr  #   rT  r  zDeployment completerY  r,  )rr  r  r  zFTP deploy job failed for r}  r  r  ).r   r  r  r  r   r0   r   r  r   r   r2   r   r   ry   ru  r2  r  r   files_totalru   rU  r   r   rb  rR  r-  ra  rS  rw   rO  rP  r   rx   rr  rz  r:  r  duration_secondsr   r   r   r<  r  r{  r  r   )rl  r<  rY  rb  rL  r|  r  remote_pathr  r  r   r   rs  s   `          @@r   run_ftp_deploy_jobrx  !  s   	BO6):Pci !h.?.?.F.F.HZbZkZkZrZrZt	v ((:&--jmmz.IJPPRvh6MNP 	
M #%((//1	

 	z
		6(:Yeg#+#4#4#;#;#=	?$VR0 (J';J$&.&7&7&>&>&@J#IIKvh6JKh 	
e "%U

		6(>QZik#+#4#4#;#;#=	? $G$>$>?ggll7#4#46F6L6LS6QRZZ[_ade	 	6(9Hce#+#4#4#;#;#=	? v%&w||W\\7CSCSU]_jlqs~H%gllGLL'BRBRT\^e^n^np{  ~C  EP  QH'
$,
!"*"3"3":":"<
  Z%<%<*-z/F/FI^I^/^.m.m.o*pJ'
		6+<Qdn #xS^,_ ( 1 1 8 8 :	<& 	
  [1&A3?@
	-077$$.0D0D0Sh}//4467  $,
!+.q6
(*2*;*;*B*B*D
'		 		6(73q6(9KSVWXSYZZ[ 	
s]   BO >CO %HO 
S<S71CR>=S7>	S
S7	S

'S71S? 7S<<S? ?Tz/api/ftp/deploy/{domain}c                   K   |j                   j                  d      dk(  r|j                          d {   ni }|j                  d      }|j                  d      }|s|j                  t              j                  t        j                  | k(  t        j                  dk(        j                         }|st        dd      |j                  }|xs |j                  }|sd	|  }t        t        j                               d d
 }t        |d| t!        t"              t"               t$        j'                  t(        || ||       d|iS 7 w)Nr  r  rY  rb  Tr  z?No default FTP binding for this domain. Set up a binding first.r  r  r  r  rl  )r  r   r/  r   r1   r   r<  r   r   r   ra  rb  r   r  r  r  r   rz   r   r  rx  )r<  r   r   r  rY  rb  rc  rl  s           r   api_ftp_deployrz  "  s(    #*??#6#6~#FJ\#\bdD,'Jxx 23((,-44$$.((D0
 %' 	 C8yzz++
+Gw/G/Gvh<r"Fv|VS1A-BDTU*FFJHXYf)  s   2E
EDE
z/api/ftp/deploy-allc           	      X  K   | j                   j                  d      }|st        d      | j                  j                  d      dk(  r| j	                          d {   ni }|j                  d      }|j                  t              j                         }|r|D cg c]  }|j                  |v s| }}g }|D ]C  }|j                  t              j                  t        j                  |j                  k(        j                  t        j                  j                  d             j                         }	|	s!|j                  |j                  d ddd	       t!        t#        j$                               d d
 }
t'        |
d|j                  t)        t*              t*               t,        j/                  t0        |
|j                  |j2                  |j4                         |j                  |j                  |
dd       F |t)        |      t7        d |D              dS 7 c c}w w)Nr   r   r   r  r  r   Tz
No package)r<  rl  r  r  r  r  F)r<  rl  r  c              3   D   K   | ]  }|j                  d       sd  yw)r  r   Nr  r
  s     r   r  z%api_ftp_deploy_all.<locals>.<genexpr>3"  s     <a1PQPUPUV_P`Q<ar~  )r  r  r  )r   r   r   r  r/  r   r1   r  r<  r    r   r  rC  r  r   r  r   r  r  r  r   rz   r   r  rx  ra  rb  r  )r   r   r   r  domains_filterrK  rf  r  rc  r  rl  s              r   api_ftp_deploy_allr~  "  s    "":.H,,#*??#6#6~#FJ\#\bdDXXi(Nxx)*..0H'F!188~+EAFFD Thhw&&w':':gnn'LMTTU\UfUfUlUlmqUrsyy{KK7>>Td^jklTZZ\"2A&6<=M9NP`a.H^H^`g`x`xyw~~ERST 3t9<a<a9abb%  
 Gs,   AH*H"A H*H%2H%6E-H*%H*z/api/ftp/bind-all-unboundc                   K   | j                   j                  d      }|st        d      |j                  t              j                  t        j                  dk(        j                         }|st        dd      i }	 | j                          d{   }|j                  d	d
      }|j                  t              j                  t        j                  j                  d            j                         }|j                  t              j                         D ch c]  }|j                   }}g }	g }
|D ]{  }|j                   }||v r|
j#                  |dd       (|j%                  d       d| }t        ||j&                  |d      }|j)                  |       |	j#                  ||d       } |j+                          |	|
|j,                  t/        |	      t/        |
      dS 7 X# t        $ r Y bw xY wc c}w w)z`Automatically bind every domain with a package (no existing binding) to the default FTP profile.r   r   r   Tr  zDNo default FTP profile configured. Set one in Server Profiles first.r  NrR  z/sitesalready_bound)r<  r  r  )r<  ra  rb  r   )r<  rb  )boundr  profile_usedtotal_boundtotal_skipped)r   r   r   r   r0   r   r   r   r/  r   r    rC  r  r  r1   r<  r  r  r	  r  r   r   rS  r   )r   r   r   default_profiler  target_baser  rf  existing_boundr  r  r  r<  
target_dirrc  s                  r   api_ftp_bind_all_unboundr  6"  s     "":.H,,hhz*11*2G2G42OPVVXO4z{{D\\^# ((;1Kxx ''(9(9(?(?(EFJJLH(*1B(C(G(G(IJ1ahhJNJEG I^#NNfHI#**3/0&:
#*--'	
 	wJGHI IIK'--5zW 5 $ 
 KsJ   A>HG/ G,G/ BHG?2B:H,G/ /	G<8H;G<<Hz/api/ftp/deployments/{domain}c                 N  K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                  d      j                         }d|D cg c]  }|j                          c}iS c c}w w)Nr\  deployments)
r   r2   r   r<  r  r{  r  r[  r  r  )r<  r   rL  rs  s       r   api_deployment_historyr  f"  s     88M"))-*>*>&*HIRRS`SkSkSpSpSrsyyz|}  B  B  DD6AAIIK6776s   BB%B 	B%u  You are Aura, an expert AI business strategist, brand consultant, and domain monetization advisor. You have deep knowledge of niche markets, affiliate programs, website development, SEO, and digital business strategy.

You are having a conversation with the user who owns or is developing a domain-based business. Be direct, insightful, and actionable. Use the project context provided to give highly specific advice rather than generic suggestions.

Key behaviors:
- Reference specific data from the user's brand kit, package, and domain analysis when available
- Suggest concrete next steps rather than vague recommendations
- When discussing their website, reference their actual sections and content
- Be concise but information-dense — the user values density over padding
- If you notice gaps in their business package, proactively mention them
- When relevant, suggest how to leverage their existing assets bettersource_pagec           
         g }|r9dd| xs d dddddd	d
d	}|j                  ||      }|j                  d|        | rddlm}  || |      }|r|j                  |       |j	                  t
              j                  t
        j                  | k(        j                         }|rdg }	|j                  r|	j                  d|j                          |j                  rS|j                  }
t        |
t              r7|	j                  d|
j                  dd       d|
j                  dd              |j                  rN|j                  }t        |t              r|j                  dg       ng }|	j                  dt        |       d       t        |j                         }t        |j"                        }|	j                  d|rdnd        |	j                  d|rdnd        |	r#|j                  ddj%                  |	      z          |j	                  t&              j                  t&        j                  | k(        j                         }|r|j(                  r|j(                  }t        |t              r|j                  dg       }|rt        |t*              r#|d d D cg c]  }|j                  d d!       c}ng }|j                  d"d#j%                  |              nd|j	                  t&              j-                         }|r?|d d$ D cg c]  }|j                   }}|j                  d%d#j%                  |              |rd&j%                  |      S d'S c c}w c c}w )(Nu3   Main Dashboard — viewing all domains and packagesu$   Package Editor — actively editing za domainu1   Advisor Workbench — managing concepts and plansu'   Deployment Manager — publishing sitesu*   SOP Documentation — reviewing proceduresu   Roadmap — planning featuresu%   Task Tracker — managing build tasksu(   Prompt Editor — customizing AI promptsu1   Architecture Diagrams — reviewing system design)	r  r  r
  rJ  r	  r  r	  r	  r	  z%[PAGE CONTEXT] User is currently on: r   rH
  zChosen niche: zBrand: r  r  u    — r  r  zSite sections: z
 generatedzHero image: yesr
  zSales letter: z[PACKAGE STATE]
r  r  rd  r   r  z)[DOMAIN ANALYSIS] Top niches identified: r6  rh  z"[WORKSPACE] Domains in workspace: r  r  )r   r  r^  r  r   r    r   r<  r   rE  r  r1  rP  site_contentr   r  rF  r(  rb  r   r  rl  r  )r<  r  r   partspage_labelsrS  r  r
  r  pkg_infobir
  r  r  r  r  r  r  rR  niche_namesr   r  rN  s                          r   build_chat_contextr  y"  s   EN<V=Qz<RSJ??6<AO

 [9<UGDEK)&"5LLhhw&&w~~'?@FFHH.1A1A0B CD!!''b$'OOgbff\5.I-J%PRPVPVW`bgPhOi$jk%%5?D5I266*b1r/#h-
 KLC../HS--.IOOlH5)*LMNOOniUY,OPQ0499X3FFGhhv%%fmmv&=>DDF3<<||H(D)!h3NXY_aeNfvbqz"J!155#5"JlnKLL#LTYYWbMcLd!ef((6"&&(-4Sb\:188:K:LL=dii>T=UVW!&6;;u.B. #K
 ;s   %M M%z/advisor/chatc                   K   | j                   j                  dd      }| j                   j                  dd      }|j                  t              j	                  t        j
                  j                               j                  d      j                         }|j                  t              j	                  t        j                        j                         }t        j                  d| ||||d|d      S w)Nr<  r  r  r  zadvisor_chat.htmladvisor_chat)r   conversationsr   initial_domaininitial_pagerz  r{  )r  r   r   r4   r  r|  r  r[  r  r   r<  r  r  )r   r   r<  r  r  r   s         r   advisor_chat_pager  "  s     !!%%h3F##FB/DHH-.778H8S8S8X8X8Z[aabdeiikMhhv''6::<G%%&9& &&<  s   C4C6z/api/advisor/chat/conversationsc                   K   | j                          d {   }|j                  dd      j                         xs d }|j                  dd      j                         xs d }|j                  dd      j                         xs d}t        |||      }|j	                  |       |j                          |j                  |       |j                  d      S 7 ­w)	Nr<  r  r  r   New Chat)r   r<  r  Tinclude_messages)r/  r   r-  r4   r   r   r  r  )r   r   r  r<  r  r   convs          r   api_create_chatr  "  s     DXXh#))+3tF((="-335=KHHWb!'')7ZE%KPDFF4LIIKJJt<<<..  s   CCCCc                   K   |j                  t              j                  t        j                  j	                               }| j
                  j                  d      }|r"|j                  t        j                  |k(        }|j                  d      j                         }d|D cg c]  }|j                          c}iS c c}w w)Nr<  r  r  )r   r4   r  r|  r  r  r   r   r<  r[  r  r  )r   r   r;  r<  convosr   s         r   api_list_chatsr  "  s     
!"++,<,G,G,L,L,NOA!!%%h/FHH%,,67WWR[__F6:aaiik:;;:s   B$C&C=	Cz)/api/advisor/chat/conversations/{conv_id}conv_idc                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  d      S w)Nr  Conversation not foundr  Tr  )r   r4   r   r  r   r   r  r  r   r  s      r   api_get_chatr  "  sW     88$%,,-=-@-@G-KLRRTD4LMM<<<..s   A%A'c                    K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       |j                          ddiS w)Nr  r  r  r  T)r   r4   r   r  r   r   r  r   r  s      r   api_delete_chatr  "  sd     88$%,,-=-@-@G-KLRRTD4LMMIIdOIIK$<r  z2/api/advisor/chat/conversations/{conv_id}/messagesc           	      F  K   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                          d {   }|j                  dd      j                         st        dd      |j                  dg       }|j                  d	      }|r||j                  k7  r||_	        |j                  d
      xs |j                  xs dg }|D ]  }|j                  d      dk(  r?|j                  d      r.|j                  d|j                  dd       d|d   d d         V|j                  d      dk(  sk|j                  d|j                  dd       d        }	|rdz   dj                  |      z   }	t        |j                  xs d|      }
t        |
      dkD  r|
d d dz   }
t        |j                  d|	      }|j!                  |       |j#                          |j                  t              j                  t        j$                  |j                  k(        j'                  t        j(                        j+                         }t-        d |D              }dt.        dg|
rj                  dd|
 d       |d d  D ]*  }j                  |j0                  |j2                  d       , |rg }|D ][  }|j                  d      dk(  s|j                  d!      s*|j                  d"d#      }|j                  d$d%| d&|d!    d'd(d)       ] |j                  d*|	d+       j                  d|d       nj                  d|	d       t              d,kD  r8D cg c]  }|d-   dk(  s| }}D cg c]  }|d-   dk7  s| }}||d.d  z   |j                  |j                  t        |      |fd/}t5         |             S 7 c c}w c c}w w)0Nr  r  r  r  r  r  zMessage content requiredr  r<  r  r
  rI  r  z[Attached: r   r  z]
r  r`  r  r  r  r  i.  z"
[...context truncated for length]r  )conversation_idr  r  c              3   j   K   | ]+  }|j                  d       dk(  xr |j                  d       - ywr  r  r  s     r   r  z(api_send_chat_message.<locals>.<genexpr>#  s-     \aQUU6]g-A!%%/A\r  r  r  z[PROJECT CONTEXT]
r  rO  r  r  r 	  r	  r	  r  r	  r	  r   r	  rQ  r  ic                 h  K   d	 dt        j                  ddi      d dt        j                  ddi      d r/ddlm}   |        t	        j
                  fd       d {   }n$t	        j
                  t        d	d
       d {   }dt        j                  ddi      d 	 t	        j
                  t        |d        d {   }|n|j                  r|j                  d   j                  rh|j                  d   j                  j                  rE|j                  d   j                  j                  }|z  dt        j                  d|i      d 	 	
fd}t	        j
                  |       d {    dt        j                  ddi      d y 7 B7  7 # t        $ rl}t        j                  d|        d}|dt        j                  dt        |      d d i      d dt        j                  d|i      d Y d }~d }~ww xY w7 w)Nr  ru  context_builtr  thinkingr   r  c                  V     j                   j                  j                  ddd      S )Nr     T)r  r  r  stream)r7  r8  r9  )_vclientr  s   r   r  z@api_send_chat_message.<locals>.event_generator.<locals>.<lambda>A#  s+    HMM55<<&.24 =  r   r  r  	streamingr  zChat stream error: zAI encountered an issue processing your request. Please try again.r   r2  c            	         t               5 } t        dd      }| j                  |       | j                  t              j                  t        j                  k(        j                         }|rTt        j                  j                         |_
        |j                  dk(  r"dk  rd d t              dkD  rdndz   |_        | j                          d d d        y # 1 sw Y   y xY w)	N	assistant)r<  r  )r  r  r  r  r  r   r	  r  r  )r   r5   r   r   r4   r   r  r   r  r  r|  r   r   r   )	save_dbassistant_msgr   conv_domainconv_id_localfull_responsehistory_lenr  user_contents	      r   save_responsezEapi_send_chat_message.<locals>.event_generator.<locals>.save_responseZ#  s     !7 +MP[er  Q\  fq  Fr  !sM*MM"23::;K;N;NR_;_`ffh#+#4#4#;#;#=ALww*,1A".s"3L@QTV@Vu\^"_ ! ! !s   CC""C+r  
message_idsaved)r/  r  r  r  r  	to_threadrB   nextr;  r	  r  r   r   r   r   )
_VisionOAIr  chunkr  r   	error_msgr  r  r  r  r  r  r  r  use_vision_modelr  s          @@r   r  z.api_send_chat_message.<locals>.event_generator7#  s    	O$djj(O9T.UVV$djj(J9O.PQQ7%<&00    '001GYacghh$djj(K9P.QRR%//fdCC===U]]1%5%;%;a@P@V@V@^@^!MM!,22::E!U*M$+TZZ%@P5QRR  		! 		! ...

L'3J(KLLM i
 D  	OLL.qc23[I%M#TZZ#a&#,8O-PQQ#TZZ)8L-MNNN	O" 	/st   H2A%F8 .F0/$F8 F3A F8 F6BF8 *#H2H0"H20F8 3F8 6F8 8	H-A"H(#H2(H--H2)r   r4   r   r  r   r   r/  r   r-  r<  r  r  rb  r  r   r5   r   r   r  r  r{  r  r  ADVISOR_CHAT_SYSTEMr  r  r   )r  r   r   r  r  chat_attachmentsdomain_overrideattachment_text_partsr	  display_contentcontext_blockuser_msgr-  
has_visionr=  user_multimodalr  r	  system_msgs	chat_msgsr  r  r  r  r  r  r  r  s                        @@@@@@@r   api_send_chat_messager  "  s    88$%,,-=-@-@G-KLRRTD4LMMD88Ir*002L4NOOxxr2hhx(O?dkk9%((=)CT-=-=CK Z776?j(SWW^-D!((;swwvv7N6OsSVWeSfgmhmSnRo)pqWWV_'!((+<SWWVW=U<VVW)XY	Z
 #O&/$))<Q2RR&t{{'8b+rJM
=E!%fu-0UU477YHFF8IIKhh{#**##tww.h{%%&ssu  \K[\\J!.ABCH8KM?6[\]s| DckkBCD # 	Cwwv')cggh.?wwv{3&&'+0hs8}o)NZ`!a( 	 	HIODEODE
8}r"*DQai8.CqDD (B1AfI,AQB	B340GGM++Kg,K!/M /Mb 011i  t EBsR   A&P!/P0C?P!0FP!P!BP! P.P2P!8PP
AP!
P!z/maximization/{domain}c                 "  K   	 |j                  t              j                  t        j                  |k(        j	                  t        j
                  j                               j                         }|st        dd      |j                  xs i }t        |      }t        j                  d| |||t        t        d||d	      S # t        $ r  t        $ r6}t         j#                  d| d|        t        d	t%        |            d }~ww xY ww)
Nr  r  r  zmaximization.htmlmaximization)	r   rs  r<  
score_datadoc_registryr  rz  r{  r  z$Error loading maximization page for r}  r3  )r   r    r   r  r  r{  r  r   r   r  r   r  r  r   r   r   r   r   r   )r   r<  r   r  r  r  r   s          r   maximization_pager  k#  s     <hhw&&w':':f'DENNwOaOaOfOfOhiooqC8[\\''-21,?
))*=$(*$(
@
 
 
	   <;F82aSIJCF;;<s)   DB?C DD1DDD)business_plan	legal_ndalegal_privacy_policylegal_terms_of_servicecontract_servicesop_customer_onboardingmarketing_email_campaigncalculator_pricingr  c                    ddl m}m} ddlm} ddlm} t               }	 t        | ddd       |j                  t              j                  t        j                  |k(        j                  t        j                  j                               j!                         }|s t        | d	d
       	 |j#                          y t%        |      }	 ||	      }
|
d   D cg c]  }|d   	 }}g d}ddddddddd}|r|D cg c]  }||v s||v s| }}n|D cg c]	  }||v s| }}|D cg c]<  }||vr6||j'                  |i       j'                  d|      |j'                  |d      d> }}|s't        | ddddg |dd       	 |j#                          y t)        |      }t        | |d| d       |j*                  xs d}|j,                  xs i }|j.                  xs i }g }t1        |      D ]  \  }}|j'                  |i       j'                  d|      }t        | d | d!|d"z    d#| d$|||d"kD  rt3        ||z  dz        nd%&       	 |d'k(  radd(lm}m} i }t;        |t<              rN|j'                  d)g       }|j'                  d*d      }|r(t)        |      |kD  rt;        ||   t<              r||   ni }|j'                  d+      xs |j'                  d,      xs i }t;        |t<              r|j'                  d-d.      nd.} t;        |t<              r|j'                  d/d0      nd0}!t;        |t<              r|j'                  d1d2      nd2}"|j'                  d3d4      }# || |!|"||#|5      }$ ||$      }%|$|d6<   |%|d7<   ||_         ||d8       |j?                          |jA                  |       nV|d9k(  rtC        tE        jF                               }&tH        jH                  jK                         }'tM        |&d:|d;d<ddd"dg |'|'|'=      }(|jO                  |(       |j?                          tQ        |&|d>?       |jS                  |       |jA                  |       n|d@k(  rdd l*})ddAl m+}*  |)jX                         }+ |)jZ                  |+       	 |+j]                   |*||            },|+j#                          |j^                  rta        jb                  |j^                        ni }-|,|-d@<   ta        jd                  |-      |_/         ||dB       |j?                          |jA                  |       ndC| dD| dEdF| dG| dHdI| dJ| dKdL| dJ| dMdN}.|.j'                  |dO      }/|/rdP}0|dQv rd@ndR}1 ||1|/|0dST      }2	 ta        jb                  |2      }3|j^                  rta        jb                  |j^                        ni }-|3|-|<   ta        jd                  |-      |_/         ||dB       |j?                          |jA                  |        t        | ddYt)        |       d#| dZd|||t)        |      |d[       |j#                          y c c}w c c}w c c}w c c}w # |+j#                          w xY w# t`        jf                  $ r3 |2tH        jH                  jK                         ji                         dU}3Y 'w xY w# tj        $ r)}4tl        jo                  dV| dW| dX|4        Y d }4~4d }4~4ww xY w# tj        $ rJ}4tl        jo                  d\| dX|4        t        | d	tC        |4      d]tC        |4       ^       Y d }4~4d }4~4ww xY w# |j#                          w xY w)_Nr   )score_package_completenessr  )call_llm_routedr  r  zAnalyzing missing components...rQ  ru  rv  rw  r  r  rQ  r
  r  )theme_customizationforce_multiplier_docsr  r  r  r  r  zrequires package regenerationz!requires graphics pack generationzrequires FTP credentials)domain_analysisr  basic_site_copyfull_site_copyhero_imagesr(  r  deployment_readyrS  znot auto-generatable)r  rS  r  r  zNothing to auto-generater,  z*All generatable components already present)builtr  r<  ru  rv  ry  rx  r  z	Building z components...rn  rv  r	  r  ... (r   r  r  r  )rv  rw  rx  ry  r  rM  r'  r  rz  r  r0  rQ  r1  rR  r2  rS  rP  r  )r0  r1  r2  r]  rU  r  rZ  r[  rV  r  business_docr  rt  r  T)all_missingr  r  r  z)Analyze the competitive landscape for a 'z' business using the domain z. Identify 5-8 key competitors, their strengths/weaknesses, market positioning, pricing strategies, and differentiation opportunities. Return as JSON with keys: competitors (array), market_gaps, positioning_recommendations, threat_level.z+Create a comprehensive SEO strategy for a 'z' business at z. Include: primary_keywords (15-20), long_tail_keywords (20-30), content_pillars (5-7 topic clusters), on_page_recommendations, link_building_strategy, local_seo_tips, technical_seo_checklist. Return as JSON.z2Generate a complete advertising copy suite for a 'z' business (a  ). Include: google_ads (5 responsive search ads with headlines and descriptions), facebook_ads (3 ad sets with primary text, headline, description), instagram_captions (5 posts), linkedin_ads (2 sponsored content pieces), email_subject_lines (10 options). Return as JSON.z(Create email marketing sequences for a 'z). Include: welcome_series (5 emails), nurture_sequence (7 emails), sales_sequence (5 emails), re_engagement (3 emails). Each email should have subject, preview_text, body_outline, cta, send_timing. Return as JSON.)r  r  r  r  r  zYou are an expert digital marketing strategist. Provide detailed, actionable, data-driven content. Always respond with valid JSON.)r  r  content_generationr  )r	  r  )rM  r  zFailed to build r~  r}  zBuilt z components)r  r  built_counttotal_attemptedz$Build missing components failed for r  rc  )8r  r  r  app.services.llmr  r  r  r   r  r   r    r   r  r  r{  r  r   r   r  r   r   rE  r[  rV  r  r:  r^  rN  rO  r1  rP  r   r  r   r  r  r  r  r"   r   _run_business_doc_generationr  r  r  new_event_loopset_event_looprun_until_completer  r/  r0  r  r3  r  r   r   r   )5rl  r<  r  r  r  r  r  r   r  r  r  r	  missing_idsgeneratableskip_reasonr   to_buildr  r  r]  r[  rV  r  r  comp_idrS  rN  rO  r  r'  r  r  r0  r1  r2  rP  rZ  r[  
sub_job_idr  sub_jobr  r  loopresearchr  r	  rG  r	  r  rawr6  r   s5                                                        r   r  r  #  s   W07	BM6):[ntuhhw&&w':':f'DENNwOaOaOfOfOhiooqvh6IJP 	
M %S)1(;(4Y(?@1qw@@b  ?=>=:;@ :	
  #7aa1;KPQU`P`aHa#.Ca!{2BCHC )BA[,@ &8&<&<Q&C&G&GQR&S*q2HIK B B vk@Z#&')gJvwy P 	
M H6uYug^;\]  -I		R^^)r
%h/ T	MLC&**7B7;;GWMEvk%c!eWAeWTU,V'.AF3'<#=PRTOM33\%'N!%."'))Ir":"')),=q"A"s7|g'=AKGT[L\^bAcWW-=ikN+//?e>CUCUV^C_eceFBLVUYBZfjjI>`iGFPQWY]F^

;	 BdmI@J6SW@XVZZ)<^gF)--fnED1'Y_e8=$[`bE 25 9I*/Jw'.7J{+%/CN!#|4IIKLL) 77!$TZZ\!2J"++224C!)N6'kTZ()qqWY#&33	G FF7OIIK0VQUVJJsOLL) 11"L17113D*G**40%#'#:#:;NvW\;]#^

AD$**S__"=VXK5=K 12&*jj&=CO!#}5IIKLL) 2[[`Zaa}  E  ~F  Fs  0t*UV[U\\jkqjr  sC  )D+]^c]ddpqwpx  yH  *I-UV[U\\hiohp  qG  ,H	G %[["5F )m5<@j5j 1  qE-eV=eijr%)ZZ_F FI__djj&AZ\/5G,*.**[*A%c=9		W-cT	Ml 	6+!'E
|1UG;G"E#(W),UO	P 	
I A  bCBJ 

,  $33 r58(J[J[JbJbJdJnJnJp%qFr  M/yfXRsKLLM  [;F82aSIJ6(#a&QTUVQWPXGYZZ[ 	
s   B[4 ?[4 Y%[4 <	YYY[4 	Y Y$[4 *AY+[4 B6[4 IZ?Y!*CZ??Y6A6Z?
2[4 [4 !Y33Z?6AZ<8Z?;Z<<Z??	[1[,&[4 ,[11[4 4	]=?]<]
 ]]
 
]doc_typer  priority_packc                     t               }	 t        | ddd       |j                  t              j	                  t        j
                  |k(        j                  t        j                  j                               j                         }|s t        | dd       	 |j                          y |j                  xs i }|j                  }	|j                  xs i }
|j                  xs i }|j                  di       }d	}d
}|rBt        | d	dt         |   d    d       t#        |||	||
      }|||<   d	}t        | d	d       n|r0t%        |      }|D cg c]  }|d   |vs| }}t'        |      }|d
k(  r.t        | dddd
dt)        |      i       	 |j                          y t        | |       t+        |      D ]  \  }}|d   }t        | d|d    d|d	z    d| d||d
kD  rt-        ||z  dz        nd
       	 t#        |||	||
      }|||<   |d	z  }||d<   t.        j.                  j1                         j3                         |d<   ||_        d
dlm}  ||d       |j9                           no|r3t@        D cg c]  }||vs|t         v s| }}t'        |      }|d
k(  r.t        | dd dd
dt)        |      i       	 |j                          y t        | |       t+        |      D ]  \  }}t         |   }t        | d|d    d|d	z    d| d||d
kD  rt-        ||z  dz        nd
       	 t#        |||	||
      }|||<   |d	z  }||d<   t.        j.                  j1                         j3                         |d<   ||_        d
dlm}  ||d       |j9                           n9|r6t!        jB                         D cg c]	  }||vs| }}t'        |      }|d
k(  r.t        | dd!dd
dt)        |      i       	 |j                          y t        | |       t+        |      D ]  \  }}t         |   }t        | d|d    d|d	z    d| d||d
kD  rt-        ||z  dz        nd
       	 t#        |||	||
      }|||<   |d	z  }||d<   t.        j.                  j1                         j3                         |d<   ||_        d
dlm}  ||d       |j9                           ||d<   t.        j.                  j1                         j3                         |d<   ||_        d
dlm}  ||d       |j9                          t)        |      }t        | dd"d|d
kD  r|n|d|i       |j                          y c c}w # t:        $ r&}t<        j?                  d| d|        Y d }~d }~ww xY wc c}w # t:        $ r&}t<        j?                  d| d|        Y d }~d }~ww xY wc c}w # t:        $ r&}t<        j?                  d| d|        Y d }~d }~ww xY w# t:        $ rG}t<        j?                  d#|        t        | dtE        |      d$tE        |       %       Y d }~d }~ww xY w# |j                          w xY w)&Nr  r  rQ  r  r  r  rQ  r  r   r   r  rS  r  r  r,  )rx  ry  r   r  z-All documents in this tier already generated!r!  r  )rn  r  r  r  )rv  rx  ry  r|  r  r  zFailed to generate r}  zPriority pack already complete!z All documents already generated!zGeneration complete!z Business doc generation failed: r  rc  )#r   r  r   r    r   r  r  r{  r  r   r   r[  rE  rM  r  r   r   r   r   r   r   r  r:  r  r  r  r  r  r   r   r   r   PRIORITY_PACK_DOCSr  r   )rl  r<  r  r  r  r  r   r  r  r]  	discoveryr  r  r  generated_countr  	tier_docsr6  missing_in_tierr  r#  r  r   r  	pack_keysr
  all_doc_keysr!  s                               r   r  r  #$  s-   	Bo6):Sflmhhw&&w':':f'DENNwOaOaOfOfOhiooqvh6IJR 	
O YY_"
  ))/R	''-2 $$["5	v1[V^I_`gIhHiil;mn&x
IVF"(IhOvqsC*40I,5TbE)9SrTOT(Ez6+Ds  CF  XY  cj  lH  IU  lV  bW  Xf 	
e v51$_5 BRY6+bk]%PSTUPUwVWX]W^^_0`*-X]`aXaCuPS@S<TghjB.r65*iXF$*IbM#q(O09L-191B1B1I1I1K1U1U1WL.'3C$G!#~6IIKB  $6cq!9:LQRVbQbcIc	NEz6+Detw  JK  U\  ^z  {G  ^H  TI  Jv 	
u v51$Y/ BR#B'6+d7m_ERUVWRWQXXYZ_Y``a0b*-X]`aXaCuPS@S<TghjB.r65*iXF$*IbM#q(O09L-191B1B1I1I1K1U1U1WL.'3C$G!#~6IIKB  '3'8'8':Q!ay>PAQLQ%Ez6+Dfux  KL  V]  _{  |H  _I  UJ  KF 	
E v51$\2 BR#B'6+d7m_ERUVWRWQXXYZ_Y``a0b*-X]`aXaCuPS@S<TghjB.r65*iXF$*IbM#q(O09L-191B1B1I1I1K1U1U1WL.'3C$G!#~6IIKB" %.[!%-%6%6%=%=%?%I%I%K\"';c>*
		,\:6+<R"YZGZO`e!5)	+ 	
o U* ! BLL#6rd"QC!@AAB d* ! BLL#6rd"QC!@AAB R* ! BLL#6rd"QC!@AAB  [7s;<6(#a&QTUVQWPXGYZZ[ 	
s
  BX +B(X U3 U3$.X $AX =A3U80X ?	V*	V*V*.X AX 3A3V/&X 	W!W!.X AX .A3W&!BX 3X 8	V'V"X "V''X /	W8WX WX &	X/X
X XX 	Y(!<Y#Y+ #Y((Y+ +Y=z#/api/business-box/{domain}/generatec                   K   	 |j                          d {   }|j                  d      }|j                  d      }|j                  dd      }|j                  dd      }|s|s|s|st        dd	      |r|t        vrt        dd
|       |r|t
        vrt        dd|       |j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      t        t        j                                }	t"        j"                  j%                         }
t'        |	d| ddddddg |
|
|
      }|j)                  |       |j+                          t-        j.                  t0        |	| f||||dd      j3                          t5        |	dd      S 7 # t        $ r t        dd      w xY ww)Nr  zInvalid JSON bodyr  r  r  r  Fr  z:Must provide doc_type, tier, all_missing, or priority_packzUnknown doc_type: zUnknown tier: r  r  r  r  rt  rQ  r   r   r  )r  r  r  r  Tr  r  )r/  r   r   r   r   r   r   r    r   r  r  r{  r  r   r   r  r  r  r  r"   r   r   r   r  r  r  r
   )r<  r   r   r+  r  r  r  r  r  rl  r  r  s               r   api_generate_business_docr  $  s    I\\^# xx
#H88FD((=%0KHH_e4MD]4pqqHL06H
4STTE!nTF4KLL
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4WXXF



"
"
$C
 C FF3KIIK+f$d;ano	
 eg6X>??c $ I4GHHIs,   G9G GG G G9G G66G9z /api/business-box/{domain}/scorec                 d  K   |j                          |j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      t        |j                        }t        |      S w)Nr  r  r  )
expire_allr   r    r   r  r  r{  r  r   r   r   r  r
   )r<  r   r  r  s       r   api_business_box_scorer  $  s     MMO
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4WXX-c.>.>?J
##s   B.B0z./api/business-box/{domain}/document/{doc_type}c                   K   dd l }t        d      D ]  }|j                          |j                  t              j                  t        j                  | k(        j                  t        j                  j                               j                         }|st        dd      |j                  xs i }|j                  di       }||v rt        ||         c S |dk  s |j                  d       d {     t        dd	| d
      7 w)Nr   r!  r  r  r  r  rR  r  
Document '' not found)r  r9  r  r   r    r   r  r  r{  r  r   r   r  r   r
   r  )r<  r  r   r  attemptr  r  r  s           r   api_get_business_docr  $  s     8 %
hhw&&w':':f'DENNwOaOaOfOfOhiooqC8[\\''-2 $$["5	y 	( 344Q;'--$$$% C*XJk0R
SS %s   CDD3D4Dc                 `  K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      |j                  xs i }|j                  di       }||vrt        dd| d      ||= ||d<   t        j                  j                         j                         |d<   ||_	        dd	lm}  ||d
       |j!                          t#        |      }t%        d||d      S w)Nr  r  r  r  r  r  r|  r   r  r  T)r  rg  r!  )r   r    r   r  r  r{  r  r   r   r  r   r  r  r  r  r  r   r   r
   )r<  r  r   r  r  r  r  r!  s           r   api_delete_business_docr  $  s    
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4WXX##)rL  b1Iy j
+4VWW( )L!)!2!2!9!9!;!E!E!GL#C7#~&IIK(6EDXNOOs   D,D.s   AuraEngine2026!SuperAdminc                    | j                   j                  dd      }|j                  d      st        dd      |dd  }|t        vrt        dd      t        j                         t        |   z
  d	kD  rt        |= t        dd
      y)NAuthorizationr  zBearer r   r  r  rB  zInvalid or expired tokenr	  zSession expiredT)r  r   r   r   _superadmin_tokensr  r4  )r   authr  s      r   _verify_superadminr   %  s    ??3D??9%NCCHE&&4NOOzz|(//%7u%4EFFr   z/superadmin/llmz"/_dev_admin/{token}/superadmin-llmc                 b   K   |r|dk7  rt        dd      t        j                  dd| i      S w)Nr  r  	Forbiddenr  zsuperadmin_llm.htmlr   )r   r  r  r  s     r   superadmin_llm_pager#  %  s9      22K@@%%&;i=QRRs   -/z/api/superadmin/authc                   K   | j                          d {   }|j                  dd      }t        j                  |j	                  d            j                         }t        j                  |t              st        dd      t        j                         j                  }t        j                         t        |<   t!        |dd      S 7 w)	Nr  r  r  r   zInvalid passwordr  Authenticated)r  r<  )r/  r   r  r  r  r  hmaccompare_digestSUPERADMIN_PASSWORD_HASHr   r  r  rQ  r  r4  r  r
   )r   r  pwpw_hashr  s        r   superadmin_authr+  '%  s     D	*b	!BnnRYYw/0::<Gw(@A4FGGJJLE %

u%ODEE  s   CCB7Cz/api/superadmin/llm/providersc                   K   t        |        |j                  t              j                  t        j                  t        j
                        j                         }t        |D cg c]  }|j                  d       c}      S c c}w w)NTinclude_creds)	r   r   r7   r  display_orderr   r  r
   r  )r   r   	providersr  s       r   superadmin_list_providersr1  3%  sb     w%..{/H/H+JZJZ[__aI	J16JKKJs   A$B&B?Bc                 t  K   t        |        | j                          d {   }|j                  t              j	                  t        j
                  |j                  d      k(        j                         }|rt        dd|d    d      t        |d   |d   |j                  dd      |j                  d	      |j                  d
d      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  d      |j                  dd      |j                  d            }|j                  |       |j                          |j                  |       t        |j                               S 7 w)Nr   i  zProvider with slug 'r_
  r  r   provider_typecloudr  sdk_typer  supports_jsonTsupports_visionFsupports_image_gensupports_streamingr1  colorr{  r  r/  r   	meta_json)r   r   r3  r  r5  r6  r7  r8  r9  r1  r:  r  r/  r;  )r   r/  r   r7   r   r   r   r   r   r   r   r  r
   r  )r   r   r  r   r  s        r   superadmin_create_providerr<  :%  sk    wDxx$++K,<,<@P,PQWWYH6J4PV<.Xh4ijj&\&\hh8*%*h/hh5!2E:88$8%@88$8$?((;-hhw	*XXfhh2((;'H  FF8IIKJJx((*++/  s   F8F5FF8z+/api/superadmin/llm/providers/{provider_id}provider_idc                   K   t        |       |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                          d {   }dD ]  }||v st        ||||           |j                          |j                  |       t        |j                  d            S 7 \w)Nr  Provider not foundr  )r   r3  r  r5  r6  r7  r8  r9  r1  r:  r  r/  r;  Tr-  )r   r   r7   r   r  r   r   r/  r  r   r  r
   r  )r=  r   r   r  r  r  s         r   superadmin_update_providerr@  W%  s     wxx$++KNNk,IJPPRH4HIIDz 2D=HeT%[12 IIKJJx((t(<==  s   A1C3C4CACc                 "  K   t        |       |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  |       |j                          t        d| d      S w)Nr  r?  r  Tr  rg  )
r   r   r7   r   r  r   r   r  r   r
   )r=  r   r   r  s       r   superadmin_delete_providerrC  g%  so     wxx$++KNNk,IJPPRH4HIIIIhIIKD[ABB   BBz/api/superadmin/llm/credentialsc           	        K   t        |        | j                          d {   }d|vsd|vrt        ddid      S |j                  t              j                  t        j                  |d   k(        j                         }|st        dd	      t        |d         }|j                  d
d      r[|j                  t              j                  t        j                  |d   k(  t        j                  dk(        j                  d
di       t        |d   |j                  dd      ||j                  d
d            }|j                  |       |j!                          |j#                  |       t        |j%                               S 7 iw)Nr=  r  r   z-Missing required fields: provider_id, api_keyr  r   r  r?  r  r   TFrS  r}
  )r=  rS  encrypted_api_keyr   )r   r/  r
   r   r7   r   r  r   r   rt   r   r8   r=  r   r  r   r   r  r  )r   r   r  r  	encryptedcreds         r   superadmin_create_credentialrI  r%  sN    wDD IT$9W&UVdghhxx$++KNNd=>Q,QRXXZH4HII i1Ixxd#
&&%%m)<<$$,	
 &,&
''hhw	*#88L$/	D FF4LIIKJJt''+  s   FF
E)Fz)/api/superadmin/llm/credentials/{cred_id}cred_idc                 "  K   t        |       |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  |       |j                          t        d| d      S w)Nr  Credential not foundr  TrB  )
r   r   r8   r   r  r   r   r  r   r
   )rJ  r   r   rH  s       r   superadmin_delete_credentialrM  %  sp     w88M"))-*:*:g*EFLLND4JKKIIdOIIKDW=>>rD  z./api/superadmin/llm/credentials/{cred_id}/testc           	      n  K   t        |       |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  }t        |j                        }t        j                         }	 |j                  dk(  rrddlm} i }|j                  rd|j                  d}|j!                  ||	      }	|	j"                  j%                  d
d      }
|
j&                  r|
j&                  d d nd}n|j                  }|s|j(                  dk(  rd}n;|s|j(                  dk(  rd}n'|s|j(                  dk(  rd}n|s|j(                  dk(  rd}t+        ||      }d}|j"                  D cg c]  }|j,                  s| }}|rt/        |d       }|d   j0                  }|j2                  j4                  j7                  |dddgd      }|j8                  r&|j8                  d   j:                  j<                  d d nd}t?        t        j                         |z
  dz        }t@        j@                  jC                         |_"        d |_#        ||_$        |jK                          tM        d!d ||d"      S c c}w # tN        $ r}t?        t        j                         |z
  dz        }t@        j@                  jC                         |_"        d#|_#        ||_$        |jK                          tM        d$d#|tQ        |      d d% d&      cY d }~S d }~ww xY ww)'Nr  rL  r  google_genair   genair  api_versionr  r  http_optionsr  zSay 'OK' in one word.r  ry	  r,  OKr	  r  huggingface'https://api-inference.huggingface.co/v1mistralhttps://api.mistral.ai/v1
openrouterhttps://openrouter.ai/api/v1r  gpt-4o-minic                 "    | j                   xs dS )Ni  )input_cost_per_mtok)r	  s    r   r  z,superadmin_test_credential.<locals>.<lambda>%  s    q?T?T?[X[ r   r0  r  r  rd  r  r?  r  T)r  ru  
latency_msr  r   Fr3  )r  ru  ra  r   ))r   r   r8   r   r  r   r   r  ru   rF  r  r4  r5  r  rQ  r  ClientrE  generate_contentr   r   r  r1  r  r  r7  r8  r9  r;  r<  r  r:  r  r  last_tested_atlast_test_statuslast_test_latency_msr   r
   r   r   )rJ  r   r   rH  r  r  r  rQ  	http_optsrR
  r  result_textr  test_client
test_modelr	  active_modelscheapestrl  latencyr   s                        r   superadmin_test_credentialrn  %  s    w88M"))-*:*:g*EFLLND4JKK}}Ht556GJJLE.q.$I  ,.H<M<MN	gIFByy11(0 2 H 2:(---DK((H =6(--="@D(--9"<6(--<"?9 8DK&J(0G11;;QGMG!-5[\%a[11
##//66 #)6MNO 7 D
 DH<<$,,q/1199$3?UYKuzz|e+t34&//668 )$+!
			QXfqrss H   quzz|e+t34&//668 '$+!
		PWbefgbhimjmbnoppqsQ   BL5C9J J!J%C4J L5J 	L2(A?L-'L2(L5-L22L5z/api/superadmin/llm/modelsc                   K   t        |        | j                          d {   }|j                  t              j	                  t        j
                  |d   k(        j                         }|st        dd      t        |d   |d   |j                  d|d         |j                  dd      |j                  d	d
      |j                  d      |j                  d      |j                  d      |j                  dd      |j                  d      
      }|j                  |       |j                          |j                  |       t        |j                               S 7 ?w)Nr=  r  r?  r  r  rJ  r  r   quality_tierr  context_windowr`  output_cost_per_mtokr1  Tr;  )
r=  r  rJ  r  rp  rq  r`  rr  r1  r;  )r   r/  r   r7   r   r  r   r   r9   r   r   r   r  r
   r  )r   r   r  r  r  s        r   superadmin_create_modelrs  %  s    wDxx$++KNNd=>Q,QRXXZH4HII'j!XXnd:.>?XXff%XXni8xx 01 HH%:;!XX&<=((;-((;'E FF5MIIKJJu(('  s   E#E D?E#z(/api/superadmin/llm/models/{model_db_id}model_db_idc                 "  K   t        |       |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  |       |j                          t        d| d      S w)Nr  zModel not foundr  TrB  )
r   r   r9   r   r  r   r   r  r   r
   )rt  r   r   r  s       r   superadmin_delete_modelrv  %  so     wHHX%%hkk[&@AGGIE4EFFIIeIIKD[ABBrD  z/api/superadmin/llm/routesc                   K   t        |        |j                  t              j                  t        j                  t        j
                        j                         }i }t        j                         D ]#  \  }}|d   |d   |d   |d   |d   |d   d||<   % t        |D cg c]  }|j                          c}|d      S c c}w w)	Nr   r   r  rp  default_providerdefault_model)r   r   r  rp  rx  ry  )routesstages)r   r   r:   r  	stage_keypriorityr  rG   rk  r
   r  )r   r   rz  stages_infosksvr^  s          r   superadmin_list_routesr  %  s     wXXh((););X=N=NOSSUFK!'') 
BvJm,vJ~. "#5 60
B
 (./1199;/  /s   B C"C9Cc           
      Z  K   t        |        | j                          d {   }dD ]  }||vs||   t        dd| id      c S  |j                  t              j                  t        j                  |d   k(  t        j                  |d   k(  t        j                  |d   k(        j                         }|rh|j                  d	d
      |_        |j                  dd      |_        |j                          |j                  |       t        |j                               S t	        |d   |d   |d   |j                  d	d
      |j                  dd            }|j!                  |       |j                          |j                  |       t        |j                               S 7 w)N)r|  r=  r  r   zMissing required field: r  r   r|  r=  r  r}  r   r1  T)r|  r=  r  r}  r1  )r   r/  r
   r   r:   r   r|  r=  r  r   r   r}  r1  r   r  r  r   )r   r   r  r  r   r  s         r   superadmin_create_router  
&  s    wD9 `U 3,DUG*L M[^__` xx!((d;//] 33T*-- eg	 
  HHZ3!XXk48
		


8H,,.//{#'j!*a(((;-E FF5MIIKJJu((3  s   F+F(F+E4F+z%/api/superadmin/llm/routes/{route_id}route_idc                 "  K   t        |       |j                  t              j                  t        j                  | k(        j                         }|st        dd      |j                  |       |j                          t        d| d      S w)Nr  zRoute not foundr  TrB  )
r   r   r:   r   r  r   r   r  r   r
   )r  r   r   r  s       r   superadmin_delete_router  )&  so     wHHX%%hkkX&=>DDFE4EFFIIeIIKDX>??rD  z/api/superadmin/llm/test-allc           
        K   t        |        |j                  t              j                  t        j                  dk(        j                         }g }|D ]  }|j                  }t        |j                        }t        j                         }	 |j                  dk(  rTddlm} i }	|j                  rd|j                  d}	|j                  ||	      }
|
j                   j#                  dd	
       n|j                  }|s|j$                  dk(  rd}n'|s|j$                  dk(  rd}n|s|j$                  dk(  rd}t'        ||      }|j                   D cg c]  }|j                  s| }}|r|d   j(                  nd}|j*                  j,                  j/                  |dddgd       t1        t        j                         |z
  dz        }t2        j2                  j5                         |_        d|_        ||_        |j=                  |j>                  |j@                  d|d        |jG                          tI        d|i      S c c}w # tB        $ r}t1        t        j                         |z
  dz        }t2        j2                  j5                         |_        d|_        ||_        |j=                  |j>                  |j@                  dtE        |      d d |d       Y d }~d }~ww xY ww)NTrO  r   rP  r  rR  rT  r  zSay OK.rV  r	  r  rZ  r[  r\  r]  r  r^  r  rW  r  r!  r  r?  r  )r  
credentialru  ra  r   r  )r  r  ru  r   ra  rX  )%r   r   r8   r   r1  r  r  ru   rF  r  r4  r5  r  rQ  r  rb  rE  rc  r   r  r  r7  r8  r9  r:  r  r  rd  re  rf  r  r   rS  r   r   r   r
   )r   r   credsrX  rH  r  r  r  rQ  rg  rR
  r  tcr	  rk  tmrm  r   s                     r   superadmin_test_allr  4&  s    wHH]#**=+B+Bd+JKOOQEG "S=="4#9#9:

	S  N2(	$$02@Q@Q RI\\'	\J		**1Ci*X#,,HMM\$A:H!hmmy&@:H!hmm|&C=HGh?,4OO Kqq{{ K K2?]1%..]##**[_?`>ano*p5::<%/478G"*"3"3":":"<D$-D!(/D%NNTZZ[dt{|}9"SF IIKG,-- !L  	S5::<%/478G"*"3"3":":"<D$+D!(/D%NNTZZ[bmpqrmstxuxmy  JQ  R  S  S	SsK   BK0CII	&I	*B?I) K0	I	K-BK("K0(K--K0r  r  r4  z#10B981u   🟢r  zGPT-5zjson,text,streamr%  i  r  g      >@)r  rJ  r  rp  rq  r`  rr  r  zGPT-4ozjson,text,stream,visionr  r  r^  zGPT-4o Minieconomyr  r  zgpt-image-1zGPT Image 1)r  rJ  r  rp  o3zo3 (Reasoning)z	json,texti@ g      D@)r   r   r3  r5  r:  r  r6  r7  r8  r9  r/  rE  r*	  zGoogle GeminirO  z#3B82F6u   🔵r  zGemini 2.5 Pror  r  r  zGemini 2.5 Flashzimagen-3.0-generate-002zImagen 3r	  
Perplexityr  z#22D3EEu   🌐r
  z	Sonar Proztext,streamr  r  )r  rJ  r  rp  r`  rr  sonarSonarr  )r   r   r3  r5  r  r:  r  r6  r7  r8  r9  r/  rE  rZ  z
Mistral AIr[  z#FF7000u   🟠zmistral-large-latestzMistral Larger   g      @zmistral-medium-latestzMistral Mediumg?zmistral-small-latestzMistral Smallg?g333333?zcodestral-latest	Codestrali  g?r\  
OpenRouterr]  z#8B5CF6u   🟣zanthropic/claude-sonnet-4zClaude Sonnet 4zanthropic/claude-haiku-3.5zClaude Haiku 3.5r  g      @zmeta-llama/llama-4-maverickzLlama 4 Maverickg?zdeepseek/deepseek-r1zDeepSeek R1g?gQ@rX  HuggingFacerY  z#F59E0Bu   🤗z$meta-llama/Meta-Llama-3-70B-InstructzLlama 3 70Brs	  zSelf-Hosted / Customzself-hostedz#6B7280u   🖥️c   z!/api/superadmin/llm/seed-defaultsc                 (  K   t        |        d}d}d}t        D ]  }|j                  t              j	                  t        j
                  |d   k(        j                         }|r	|dz  }|j                  dg       D ]  }|j                  t              j	                  t        j                  |j                  k(  t        j                  |d   k(        j                         }|rht        |j                  |d   |d   |j                  dd      |j                  d	d
      |j                  d      |j                  d      |j                  d            }	|j                  |	       |dz  } Vt        |d   |d   |j                  dd      |j                  d      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      d|j                  dd      |j                  d      |j                  dd            }
|j                  |
       |j                          |dz  }|j                  dg       D ]  }t        |
j                  |d   |d   |j                  dd      |j                  d	d
      |j                  d      |j                  d      |j                  d            }	|j                  |	       |dz  }  |j                          t        d|||d       S w)!Nr   r   r   rE  r  rJ  r  r   rp  r  rq  r`  rr  )r=  r  rJ  r  rp  rq  r`  rr  r   r3  r4  r  r5  r  r6  Tr7  Fr8  r9  r:  r{  r  r/  )r   r   r3  r  r5  r6  r7  r8  r9  r1  r:  r  r/  )r  created_providerscreated_modelsskipped_providers)r   SEED_PROVIDERSr   r7   r   r   r   r   r9   r=  r  r  r   r  r   r
   )r   r   r  r  r  r   r   smexisting_modelr  r  s              r   superadmin_seed_defaultsr  &  s    wNG 5 88K(//0@0@BvJ0NOUUWqLGffXr* (!#(!3!:!:((HKK7%%J7" %'  &$$,KK!#J%'%7VVFF3%'VVNI%F')vv.>'?,.FF3H,I-/VV4J-K	E FF5M"a'N#($ FF&&':VVJ'VVJ1&&$7FF#4e<!vv&:EB!vv&:DA&&),&&!4
 	x

Q&&2& 	 B$KKJ/VVFF+VVNI>!vv&67$&FF+@$A%'VV,B%C	E FF5MaN	 S5 l IIK.($	  s   C#L&H,Lr   c                 *	  K   ddl m}m} d}|j                  t              j                  t        j                  j                  d             j                  t        j                  j                               j                         }g }t               }|D ]  }|j                  |v r|j                  |j                         |j                  xs i }	|	j!                  dg       }
|	j!                  dd      }|
r|t#        |
      k  r|
|   n|j                  dd}|j                  xs i }|j                  t$              j                  t$        j                  |j                  k(        j'                         } |||	|j(                  |      }||k  r ||      }|j!                  dg       }|j!                  d	|j!                  d
g             }|j!                  d|j!                  dg             }|j!                  dg       }|dk\  rdn|dk\  rdnd}d }|j(                  r'|j(                  j+                  d      r|j(                  }|j!                  di       }|j-                  |j                  |j!                  d|j                        |j!                  dd      |j.                  xs d|t1        |      |||j!                  d|	j!                  dd            |j!                  d|	j!                  dd            t3        |t4              xr t#        |      dkD  t3        |t4              xr t#        |      dkD  t3        |t4              xr t#        |      dkD  t3        |t4              xr t#        |      dkD  |d        |j7                  d d        |D cg c]  }|d!   d"k(  s| }}|D cg c]  }|d!   d#k(  s| }}|D cg c]  }|d!   d$k(  s| }}t9        d% |D              }t1        t9        d& |D              t;        t#        |      d'      z        }t=        t        d( |D                    }t#        |      t#        |      t#        |      t#        |      ||d)}t>        jA                  d*| ||||d+      S c c}w c c}w c c}w w),Nr   calculate_quality_scorequality_badge_tierr   r'  r(  r  r  rN  pricing_tierspricing_plansr4  rP  rK  Z     rp    )  r  r  r   r  r0  r)  r*  r1  r+  r,  )r<  r  r  r]  r
  r  rp  listing_pricer)  r+  has_featureshas_pricinghas_faqhas_testimonialsr  c                     | d   S )Nr  r   r  s    r   r  z!storefront_page.<locals>.<lambda>"'  s    / 2 r   Tr  rp  r%  r  r&  c              3   &   K   | ]	  }|d      yw)r  Nr   r  s     r   r  z"storefront_page.<locals>.<genexpr>&'  s     ;Qa(;r  c              3   &   K   | ]	  }|d      yw)r  Nr   r  s     r   r  z"storefront_page.<locals>.<genexpr>''  s     ?!O,?r  r   c              3   2   K   | ]  }|d    s	|d      yw)r]  Nr   r  s     r   r  z"storefront_page.<locals>.<genexpr>('  s     Cq'
'
Cs   

)r  r
  premium_countstandard_countr  rO  zstorefront.html)r   r  legendary_packagesrQ  r  )!app.services.quality_scorerr  r  r   r    r   rC  r  r  r{  r  r  r   r  r   r[  r   r   r$   r   rF  r   r  rE  r  r1  rl  r5  r  r  r  r  r  ) r   r   r  r  	min_scorepackages_querypkg_listseen_domainsr  r[  r'  r(  r*  rC  r  r!  r  rN  rO  rP  rK  r  r
  r  r  r%  r  r&  r  rO  r  rQ  s                                    r   storefront_pager  &  s    WIXXg&--g.?.?.E.Ed.KLUUV]VhVhVmVmVopttvNH5L '??l*)		R))Ir*iiq1)0[3w<5O%^a^m^mz|U}MM'R	)001D1D1WX^^`'	5#:L:Lm\9!%(==R0--PR1STmmKub)AB }}^R8${u{
#"4"4"?"?"D++J**Y+oo **VS__=zz)R0%%+$"5\ *$[[EIIoy4YZ&{{;		BSU^8_`&x6L3x=1;L%gt4IW9I!#t,=SA *< > X3|CTWXCX*
 	/'P MM2DMA$Iq.(9[(HIII"EQa&79&DqEGE#Gaq'8J'FGHG;(;;Kc?h??#c(mUVBWWXICCHCCDFXy>Wh-"E %%&7':   JEGs=   NRR'R+R1R	?R	R	RRB8Rz/api/storefront/packagesc                   K   ddl m}m} | j                  t              j                  t        j                  j                  d             j                  t        j                  j                               j                         }g }|D ]9  }|j                  xs i }|j                  dg       }|j                  dd      }|r|t        |      k  r||   n|j                  dd}	|j                  xs i }
| j                  t               j                  t         j                  |j                  k(        j#                         } ||
||j$                  |      } ||      }|dk\  rdn|d	k\  rd
nd}|j'                  |j                  |	j                  d|j                        t)        |      ||||j*                  xs dd       < t-        d|i      S w)Nr   r  r'  r(  r  r  r  r  rp  r  r  r   )r<  r  r  rp  r  pricer]  r  )r  r  r  r   r    r   rC  r  r  r{  r  r  r[  r   r   r  r$   r   rF  r  r  rE  r
   )r   r  r  r  r  r  r[  r'  r(  r*  rC  r  r!  r  r  s                  r   storefront_api_packagesr  :'  s    WXXg&--g.?.?.E.Ed.KLUUV]VhVhVmVmVopttvNH 		R))Ir*iiq1)0[3w<5O%^a^m^mz|U}MM'R	)001D1D1WX^^`'	5#:L:Lm\!%(${u{oo **VS__="5\ *"%%+
 	& X.//s   GGz /api/storefront/package/{domain}c           
        K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      ddl	m
}m} |j                  xs i }|j                  xs i }|j                  dg       }|j                  dd      }|r|t        |      k  r||   n| dd	}	|j                  t               j                  t         j                  | k(        j#                         }
 ||||j$                  |
      }t'        | |	j                  d
|       |	j                  dd      |j(                  xs dt+        |       ||      d      S w)Nr  r  r  r   r  r'  r(  r  r  r   r  )r<  r  r  r]  r  rp  )r   r    r   r  r  r{  r  r   r   r  r  r  r[  rC  r   r   r$   r   rF  r
   rE  r  )r<  r   r  r  r  r[  rC  r'  r(  r*  r  r!  s               r   storefront_api_package_detailr  U'  sM    
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHHWIIOE#Iii	2&G))M1-K%,s7|1KW[!Z`moQpFHHW%,,W-@-@F-JKQQSM#Iuc6H6H-XEjj0::i,!!'Ru*51  s   FFz/api/storefront/checkoutc                 l  K   	 | j                          d {   }|j                  d      }|j                  dd      }|st        dd      |j	                  t
              j                  t
        j                  |k(        j                         }|st        dd	      	 d
dl	m
} t        | j                        j                  d      } |||| d| | d      }t        |      S 7 # t        $ r t        dd      w xY w# t        $ r"}	t        dt        |	      id      cY d }	~	S d }	~	ww xY ww)Nr  zInvalid JSONr  r<  r  r  zdomain is requiredr  r  r   )create_checkout_sessionr  z/storefront?purchased=r   )r<  r  success_url
cancel_urlr   r3  r   )r/  r   r   r   r   r    r   r  r   app.services.stripe_servicer  r   r  r	  r
   )
r   r   r+  r<  r  r  r  r  r  r   s
             r   storefront_checkoutr  l'  s.    D\\^# XXhF88FN+D4HII
((7

"
"7#6#6&#@
A
G
G
IC4GHH@Gw''(//4(#*$:6(C";/	
 F##' $ DNCCD&  @Wc!f-3??@s]   D4C, C*C, BD4!AD )D4*C, ,DD4	D1D,&D1'D4,D11D4z/api/storefront/webhookc                 J  K   | j                          d {   }| j                  j                  dd      }	 ddlm}m}m}  |||      }|j                  d      dk(  ro|j                  di       j                  di       j                  d	i       }|j                  d
      }	|	r* ||	      }
 ||
|	       t        j                  d|	 d       t        ddi      S 7 # t        $ r:}t        j                  d|        t        dt        |      id      cY d }~S d }~ww xY ww)Nzstripe-signaturer  r   )verify_webhook_signaturegenerate_download_tokenstore_download_tokenr
  zcheckout.session.completedr  objectr@  r<  zPayment completed for z, download token generatedru  r  zWebhook error: r   r  r   )r+  r  r   r  r  r  r  r   r   r
   r   r   r   )r   r   payloadsigr  r  r  r  r
  r<  r  r   s               r   storefront_webhookr  '  s    LLN"G
//

0"
5C@ww(#699V <<99VR(,,Xr:>>z2NDXXh'F/7$UF34VH<VWXXt,-- #  @qc*+Wc!f-3??@s?   D#C D#B"C D#	D &/DD D#D  D#z /api/storefront/download/{token}c                 .  K   ddl m}  ||       }|j                  d      st        dd      |d   }|j	                  t
              j                  t
        j                  |k(        j                         }|st        dd	      t        d
|dd      S w)Nr   )validate_download_tokenvalidr  z!Invalid or expired download tokenr  r<  r  r  r  zDownload would be served here)ru  r<  r<  )
r  r  r   r   r   r    r   r  r   r
   )r  r   r  r  r<  r  s         r   storefront_downloadr  '  s     C$U+F::g4WXXHF
((7

"
"7#6#6&#@
A
G
G
IC4GHH7fIhijjr  z/api/admin/dedup-augmentsc                   K   | j                   j                  d      }|st        d      	 | j                          d {   }|j                  dd      }ddlm}  |||      }t        |      S 7 1# t        $ r i }Y <w xY ww)	Nr   r   r   dry_runTr   )remove_duplicate_augments)r  )r   r   r   r/  r   app.services.augment_dedupr  r
   )r   r   r   r+  r  r  r  s          r   admin_dedup_augmentsr  '  s     "":.H,,\\^# hhy$'GD&r7;F $ s:   *BA4  A2A4 -B2A4 4B?BBBz/api/listing-copy/{domain}c                   K   |j                  t              j                  t        j                  | k(        j	                  t        j
                  j                               j                         }|st        dd      ddl	m
}m} ddlm} |j                  xs i }|j                  xs i |j!                  dg       }|j!                  dd      }	|r|	t#        |      k  r||	   n| d	d
}
|j                  t$              j                  t$        j                  | k(        j'                         } |||j(                  |      } ||      }j!                  dg       }j!                  dj!                  dg             }j!                  dj!                  dg             }j!                  dg       }t+        fddD              }|dk\  rdn|dk\  rdnd} || |
j!                  d|       |
j!                  dd	      |j,                  xs d	t/        |      ||t1        |t2              rt#        |      nd||t1        |t2              xr t#        |      dkD  t1        |t2              xr t#        |      dkD  t1        |t2              xr t#        |      dkD  j!                  dd	      j!                  dd	            }t5        |      S w)Nr  r  r  r   r  r  r'  r(  r  r  rN  r  r  r4  rP  rK  c              3      K   | ]S  }j                  |      r@t        |   t              rt        |         d kD  st        |   t              r	|   rd U yw)r   r   N)r   r1  rl  r   rP  )r  r  rC  s     r   r  z#api_listing_copy.<locals>.<genexpr>'  s      ca$==+*Yq\42PUXYbcdYeUfijUjpz  |E  FG  |H  JN  qO  T]  ^_  T`  cs   AA)rN  r  r4  rK  how_it_works_stepscomparison_tablerQ  r  r  rp  r  r  r   r  rN  rO  )r<  r  r  r]  r  rp  r  r
  r  r  r  r  r  rN  rO  )r   r    r   r  r  r{  r  r   r   r  r  r  app.services.listing_generatorr  r[  rC  r   r   r$   r   rF  r  rE  r  r1  rl  r
   )r<  r   r   r  r  r  r  r[  r'  r|  r*  r  r!  r  rN  rO  rP  rK  r  r  r  rC  s                        @r   api_listing_copyr  '  s_    
((7

"
"7#6#6&#@
A
J
J7K]K]KbKbKd
e
k
k
mC4GHHWDIIOE#Iii	2&G
))M1
%C$s7|);WS\&]_A`FHHW%,,W-@-@F-JKQQSM#Iuc6H6H-XEe$D}}Z,HmmOY]]?B-OPG
--Y]]5"%=
>C==4L c  $Q c cM B;C5B;CCM"&**VV"<fjjQZ\^F_$"E%Lt#JxY]D^3x=de#=w-B#g,2B3%6#c(Q,#L$7QC<MPQ<Qz2.IMM-Y[<\	F s   KKz/api/storefront/exportc                    K   | j                   j                  d      }|st        d      ddlm} t        | j                        j                  d      } |||d      }t        |	      S w)
Nr   r   r   r   r  r  r  r  r  )	r   r   r   r  r  r   r  r	  r	   )r   r   r   r  r  r  s         r   api_storefront_exportr  '  s_     "":.H,,L7##$++C0H%b82ND%%s   A+A-z/api/storefront/deploy-ftpc                 T  K   | j                   j                  d      }|st        d      | j                  j                  d      dk(  r| j	                          d {   ni }|j                  d      }|j                  dd      |j                  d	d
      }|st        dd      |j                  t              j                  t        j                  |k(        j                         st        dd      ddl
m} t        | j                        j                  d      } ||||      }d|idd l|j                  t               j                  t         j"                  j%                  d             j'                         D ]  }	|	j(                  s|	j(                  j+                  d      s,|	j(                  j-                  d      }
j.                  j1                  |
      sct3        |
d      5 }|j5                         |	j(                  j-                  d      <   d d d         t        t7        j8                               d d t;        ddddddddddddg       fd }t<        j?                  |       tA        d!d"      S 7 6# 1 sw Y   xY ww)#Nr   r   r   r  r  rY  rb  r  r  r  r  zprofile_id is requiredr  r  rl  r   r  r  r  rK  r  storefront_deploy
storefrontr!  rQ  rb  r  r  	UploadingrY  Donec            
         	 ddl m} m}m} t	        	ddd        |j
                        }
j                  j                  j                  j                  d            j                  dd      }	fd	}j                  d
k(  r- | j                  j                  j                  |||      }n7 |j                  j                  j                  |j                  ||      }t	        	dddd|i       y # t        $ r9}t         j#                  d|        t	        	dt%        |             Y d }~y d }~ww xY w)Nr   rw   rx   ru   r  zConnecting...r\  ru  rv  ry  r  rn  c                 d    dt        d| z  t        |d      z        z   }t        d| |       y )Nr\  K   r   rq  rv  ry  r:  r  r  r  r  r  r  rl  s       r   r  zCapi_storefront_deploy_ftp.<locals>._run_deploy.<locals>.progress_cb(  5    3rH}s5!}<==6*XJ0GVYZr   rT  r  zStorefront deployed!r,  rr  r  zStorefront FTP deploy failed: r  rQ  )app.services.ftp_deployrw   rx   ru   r  rU  r   rb  rR  r-  ra  rS  rO  rP  r   r   r   r   r   )rw   rx   ru   r  rw  r  r  r   r|  rl  r   rL  rb  s           r   _run_deployz.api_storefront_deploy_ftp.<locals>._run_deploy	(  s5   	>aavio\^_'(B(BCH'',,w'8'8:J:P:PQT:UV^^_cehiK[ 6)*7<<wGWGWYacnpu  xC  D)',,gFVFVX`bibrbrt  BG  IT  Uvk@Veh/:< 	>LL9!=>vhc!f==	>s   C:C> >	E /D;;E r  r  )!r   r   r   r  r/  r   r0   r   r  r   r  r  r   r  r	  r   r    rC  r  r  rF  r   r5  r   r4  rc  r  r  r  r  r   r  r
   )r   r   r   r  rY  r  r  r  r  r  
local_pathr  r  r|  rl  r   rL  rb  s                @@@@@r   api_storefront_deploy_ftpr  '  sY    "":.H,,#*??#6#6~#FJ\#\bdD,'Jxx 2C8HH_b1M4LMMhhz"))*--:*EFLLNG4KLLL7##$++C0H%b8=YD4 Exx ''(9(9(?(?(EFJJL E#"4"4"?"?"D++2237Jww~~j)*d+ Eq<=FFHE#,,33C89E E	E r"Fv*L!5xR]7^hr  ~D  aE  FG> >& $6Y?@@e  .E Es>   AJ("J#D7J(J(76J(.J(:-J'A2J(J%	 J(z/api/storefront/regen-deployc                 `  K   | j                   j                  d      }|st        d      i }	 | j                          d{   }|j                  d      }|j                  dd      |j                  dd	      }|rD|j                  t              j                  t        j                  |k(        j                         }nC|j                  t              j                  t        j                  d
k(        j                         }|st        dd      ddlm} ddlt        | j                        j!                  d      } ||||      }	d|	i}
|j                  t"              j                  t"        j$                  j'                  d            j)                         D ]  }|j*                  s|j*                  j-                  d      s,|j*                  j/                  d      }j0                  j3                  |      sct5        |d      5 }|j7                         |
|j*                  j/                  d      <   ddd        t        t9        j:                               dd t=        ddddddddddddg       |j>                  |j@                  |jB                  |jD                  |jF                  |jH                  dtK        |
      fd }tL        jO                  |       tQ        |jR                  d!d"      S 7 # t        $ r Y w xY w# 1 sw Y   xY ww)#zfOne-shot: regenerate static storefront HTML and FTP-deploy it. Uses default profile if none specified.r   r   r   NrY  rb  r   r  r  Tr  z8No FTP profile found. Configure a default profile first.r  r   r  r  r  r  rK  r  r  r  r!  rQ  Regeneratingr  r  r  rY  r  )rO  rP  r   rS  rR  rU  c            
         	 ddl m} m}m} t	        	ddd        |d         }
j
                  j                  d   j                  d	            j                  d
d	      }	fd}d   dk(  r | d   d   d   |||      }n |d   d   d   |d   ||      }t	        	ddd|d   |d       y # t        $ r9}t        j                  d|        t	        	dt        |             Y d }~y d }~ww xY w)Nr   r  r  zConnecting to server...r^  r  rU  rR  r  rn  c                 d    dt        d| z  t        |d      z        z   }t        d| |       y )Nr^  r	  r   rq  r  r  r  s       r   r  z>api_storefront_regen_deploy.<locals>._run.<locals>.progress_cbW(  r  r   rS  rT  rO  rP  r   r  zStorefront live!r,  )rr  rL  r   r  z Storefront regen-deploy failed: r  rQ  )r  rw   rx   ru   r  r   rb  r-  ra  r   r   r   r   )rw   rx   ru   r  rw  r  r  r   files_snapshotrl  r   profile_snapshotrb  s           r   _runz)api_storefront_regen_deploy.<locals>._runP(  s?   	>aavi>Wfhi'(89M(NOH'',,'7'DFVF\F\]`FabjjkoqtuK[  
+v5*+;F+CEUV\E]+;J+GS^`np{} **:6*BDTU[D\*::*FRbcmRn*5~{T vk@Rad19FVW]F^hstv 	>LL;A3?@vhc!f==	>s   B9B= =	C?/C::C?r  )rl  rL  r  ru  )*r   r   r   r/  r   r   r0   r   r  r   r   r  r  r   r   r  r	  r    rC  r  r  rF  r   r5  r   r4  rc  r  r  r  r  rO  rP  r   rS  rR  rU  rP  r   r  r
   rS  )r   r   r   r  rY  r  rL  r  r  r  r|  r  r  r  r  r  rl  r   r  rb  s                  @@@@@r   api_storefront_regen_deployr   (  s     "":.H,,D\\^# ,'Jxx 2MBHH_b1M((:&--jmmz.IJPPR((:&--j.C.Ct.KLRRT4nooL7##$++C0H%b8=YD4 Exx ''(9(9(?(?(EFJJL E#"4"4"?"?"D++2237Jww~~j)*d+ Eq<=FFHE#,,33C89E E	E r"Fv*L!8(U`:aku  AG  dH  IJ !(gllPWP`P`$+$4$47CTCT.5.H.HJ %[N> >2 6gmmO_ktuvvC $ 4E Esf   ,L.L LL E(L.5L.6L.L.-L!CL.L 	LL.LL.!L+	&L.)NN)r  )rG  NrI  rK  Nr   r  )rR  r   r  )r  )F)r  r  rA  )Nr\  )r;  )NNFF(  r   r`  r  r]  loggingr  r/  r  r  r  r   concurrent.futuresr  pathlibr   r)  r  r  
contextlibr   fastapir   r   r   r   fastapi.responsesr	   r
   r   r   r   fastapi.staticfilesr   fastapi.templatingr   pydanticr   r   r   r   r   sqlalchemy.ormr   sse_starlette.sser   typingr   r  starlette.middleware.sessionsr   rO  r   r   r   r   r   r   r   rC  r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r\  r;   r<   r  r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   r1
  rJ   rK   rL   rM   rN   rO   rP   rQ   rR   app.services.augmentsrS   rT   rU   r  rW   rK  rX   rY   rZ   r[   r\   r]   rp  r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   app.services.advisorrl   rm   rn   ro   rp   rq   rr   rs   r  rt   ru   rv   rw   rx   ry   rz   r  r{   r|   r}   r~   r   r   r   app.services.business_docsr   r   r   r   r   r   	getLoggerr   r   r   ThreadPoolExecutorr   r  r  r  r  r   r   r   r   app.routes.aura_core_apir   aura_core_routerinclude_routermountstarlette.middleware.baser   r   add_middlewarer6  r   r  r   
middlewarer  r  envauto_reloadMarkdownr  r  r'  r   r9  r;  rE  r  r  rd  r  r  r:  rl  rP  r  r  r  r   r   r  r  r  r  r  r  r  r  postr  r  r  r*  r:  r>  ro  rs  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rU  r_  rb  rd  rh  r  r  r  r  r  r  r  r   r$  rA  rD  rJ  rP  rR  rW  r[  r]  ra  re  rj  rt  rv  r  r  r  r  r  r  putr  r  r  r7  rN  r{  r  r  r  r  patchr  r  r  r  r  r  r  r  r  r  r  r#  r?  rF  r\  r^  rc  rl  rq  rv  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r=  r  r  r  r!  r  r'  r  r  r  ry  r  r  r  r  r  r  r  r  r	  r!	  r%	  r(	  rC	  rZ	  r_	  rb	  re	  ro	  rv	  rz	  r}	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r	  r
  r
  r'
  r2
  r7
  r:
  r<
  r@
  rD
  rF
  rM
  rS
  rU
  rY
  r]
  ra
  rd
  rf
  ri
  rk
  ro
  rv
  r{
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r  r  r  r  r  r  r#  r(  r+  r-  r1  r>  rB  rE  rH  rG  rV  rX  r[  r]  r_  rd  rg  rj  rx  rz  r~  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r&  r4  r  r  r  r(  r  r   r#  r+  r1  r<  r@  rC  rI  rM  rn  rs  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     sk>   	 	      
 	       * < < g g + . / ! " 1   ;  * * 6 6        < K K  
  
 ] \ 1           
 
		8	$!!44Wa4b##661Ye6f   > & & &0 9HM ?   # $ 		)[848	 D 9(+ (   % &   $@PRm1n  oD  W    o6	 	 r{{&FG> .	  d )# )# )@
9 
') ' 1Bl}~!5F~  PQ  R$8  JO  `b  c 3D|  NO  P!4Egxyz .?gxyz7  IE  VX  Y3  ED  UW  X4  FD  UW  X5Fu  GI  J/@`qrs!3Devwx [9Zklm 1B^opq&;  MD  UW  X(<M  QS  T%<  NW  hj  k!2C|  NO  P [9M^_`#:  LI  Z\  ]!4Ectuv  [9Whij$7H{  MO  P/@\mno@m~  A	 s c 3 S X\ lp   DG >/s /d  <(!S !s ! !HYc YD Ys YxC# CC CS CQT Crv C  NQ C  nq C  KO C  fi CL!C !c !HKS Ks K# KVY Kps K  LP K\+S + +WZ +cg +\   ,/g  0  (& & &R .  	2<PHOPV &S &g & Q& 	/MU\]cUd 1$W 1$S 1$# 1$7 1$ N1$h 	4\RZabhZi ' # s PW  S@ 	/MU\]cUd 8W 8S 8# 87 8 N8 	5lS	),GRVfmntfu Lw Ls LC LC L\c L H TL\ ;' ; ;
 ,/5<V_ g 7  0 	&|D	,7   8 E 	/M	"<@?CSZ[aSb     A N 	|<W  = 	*<H	l;	G 	C 	 < I	 	( ( 
$%
!s 
!W 
! &
! &'C C (C
4d 4n 	12PWX^P_ ;3 ; ;g ; 3; 	12<@UYipqwix A3 Ac A7 A_f A 3A 	!"W  # 
89V]^dVe @ @w @G @ :@> 
34QXY_Q` C ' w  5 
23PWX^P_ 3  g  4 5;B6? G   6 	*<HKRSY?     I 	 >w  ? 
#$7>v a
 a
W a
 %a
H 	&';B6? 6G 6 6 (6$ 
#$7>v 
6 
6W 
6 %
6 
6=fo Qw QG Q Q* ()DKFO 
s 
W 
' 
 *
WW WC Wt 	(F\*4;FORV BW B' BC B + GBJ 	0N	l;<CFOZ^ SW S' STW S < OS 
./MTU[_ @ @g @7 @ 0@ 	 07 $g $ !$ 
'(DKFO $W $' $ )$* 
 J"6 J !J  
LW L  L^ 		 	 
Z7 Z Zz 	 !5<V_ # 7  " 
'(6C 6 )6$ 
()S  *B 
&'3  (& &*DPT%'wv1 1c 1# 1"1-41 1$ 
67>Efo N3 NG N 8N@ 
<=DKFO e e' e >e* 	,-9@ \c \w \ .\ 	23?Fv jC jW j 4j 	!".5fo 5G 5 #52 |4:A&/ 7   5  	),GJQRX/ S 7   H&IX 	"#/6v +W + $+ 	)*+26? C. C. +C.L 
)*GNv 1  1 W 1  +1 l 	$%-14.2'&/
9s 
9S 
9(+
98?
9 &
9 
%&IPQW #' #w # '#L 	12ZabhZi S 7 PW  3 45HOPV S g  6 
01ELV_ $4g $47 $4 2$4R 	&'@G SS Sg S (Sl 
DKFO >!4 >' >  >BeS es e3 ec eZ^ eP 
)*EI#Y+/876?dc d$z2B d%(d9@d +dN 
*+9;5`ghn`o zs z3 zD zV] z ,z" 	!"6=fo ;3 ;G ; #;| 56NUV\o RC R3 RG R 7R> 45`ghn`o 7C 73 7 7V] 7 67t 	;<PWX^P_ c S g  =0 	78PWX^P_ Fc FS Fg F 9F2 	78elmset g g gg g[b g 9g6 
;<OVW]swx{s| %S %C %W %fp % =%P 
)*,3FO %' % +%P $%9@ /c /w / &/& ?@12;<";<!:;  LWF^X# XC XS X+.X@CXv 
+,RYZ`Ra ES E7 E E -E. 	!";B6? 
 
 
 #
 	./?Fv 2C 2W 2 02j 
-.U\]cUd L< L<g L<7 L< /L<^ 	 	 !	 
./MTU[_ vD vDg vD7 vD 0vDr 	)*>Efo I3 IG I +I 
*+QXY_Q` :VC :V' :Vw :V ,:Vz 
343S 37 3 53. 
34CJ6?    5 
:;Y`agYh C ' w  <  	./?Fv C W  0: 	   	#$2 2 %20 	'(8S 8 )8@  3   
#$? ? %?D 	!"s  #
 	!" # 
#$g  % 
)*:G : +: 	/0@G S g  1 )0 w    	!"6=fo 3 G  # 	,7DKFO 3 3 3' 3 83l 	<8IPQW W c w  9D 	 7>v YC YW Y !Yx 	#$:>gV\o $ $4 $G $ %$N 	)*LSTZO fs fW f' f +f& 	"#3:6?    $ ?6=@L^'T9x}@ 	*+;B6?    ,4 	.|L	L9FMfodh O' O3 OG O^a O : MOd 
/0JQRX/ *8S *87 *8 *8 1*8Z 
,-GNv 8# 8 8W 8 .88 
/0JQRX/ 4S 47 4 4 146 
26s) ?tJ/ ? ?D 	%&  ' 
*+ELV_ h hg h7 h ,hV 
01KRSY? .0c .0G .0 .0 2.0b 
-.HOPV 93 9 9g 9 /9, 9:DKFO 9S 9 9' 9 ;9  
/0JQRX/ y5S y57 y5 y5 1y5z $W5!73"F3-w?,f=0(C  
23MTU[_ 2: 2:g 2:7 2: 42:j 
34NUV\o : :w :G : 5:> 	,-:A&/ Fs F F .F 
-.HOPV 7P3 7P 7Pg 7P /7Pt 
01KRSY?  Ic  IG  I  I 2 IF 
-.:>x.]abe]fv}  E  wF F3 FC FPZ Fls F /FB 	'(8? S g  )" 	12FMfo c 3 G  3& 	  	!"7>v 
C 
W 
 #
 
*+:A&/ 	Es 	E 	E ,	E 
+,LSTZO [s [W [' [ -[. 
#$AH D' Dw D %DN 	 >9@ Mc Mw M ?M 	,\JZabhZi %W %c %s %PW % K%P ()<CFO  '  *$ 	%&NUV\o  w G  '4 -uG u .u 6GW G 7G 	&-fo ~G ~ ~B 	&':A&/ =s = = (=@ 	&-fo HG H HV L1  2  \2  3 	6|TW  U L17>v M MW M 2M
 .;B6? 
+G 
+ 
+ 
+ #$LSTZO s W '  %& $%:A&/ s   & 	 !5<V_ 
# 
7 
 "
 	/6v 
W 
  
 	DKFO W '     *1&/    	 3:6? 
 
 
 !
 /=DV_ Dg D7 D D0 	 HOPV 3  g  !$ "#6=fo 3 G  $ 
 !=DV_ Qg Q7 Q "Q6 	&'6=fo 
3 
G 
 (
 	01<CFO O O' O 2O ,/5<V_ Sg S7 S 0S 8?  g  2 ,:A&/ +7 + + +" 
@G C Cg C C* !"HOPV 3  g  #* "#6=fo 3 G  $ )*=DV_ # 7  + 	"#:A&/ s   $ 	 (/ vg v !vr 
()'.v oW o *od 	*+.5fo %G % ,% 	'(4;FO  '  )8 	+26? . .  .b L17>v 	 	W 	 2	 
!"=DV_ g 7  #< 	 !<CFO 9W 9' 9 "9 	-.9@ c w  / /0NUV\o  w G  14 01<CFO  '  23C 3S 3l 
67=DV_ # 7  8: :# :z 
34:A&/ s   5 
56<CFO t t' t 7t 
 =DV_ g 7  !29# 9D 9 9x 
9@ >' >w >  >2 	():A&/ s   * 	%lCFMfo * *w *G * D* <06=fo w G  1$ 
AH ' w  ( 	.5fo 9G 9 9
 	)*RYZ`Ra S 7   +2 ,-@G S g  . 
12AH c w  3 
AH ' w  4 	@G 9 9g 9 9 ,-@G S g  .Qs QC QS QTW Qh 
$%FMfo  w G  &0 
 =DV_ cg c7 c !c2 
%&CJ6? ,G , , ',^ 	()<CFO 8 8' 8 *8

I 9/s 9/ 9/' 9/c 9/x 6<CFO W '  7 
+,:A&/ 	/7 	/ 	/ -	/ 	*+9@ <' <w < ,< 	453:6? / / / 6/ 786=fo 3 G  9 
>?NUV\o y2 y2w y2G y2 @y2x 	!,?IPQW <W <c <w < @<6 R# Rs RRV Rjq qc qS qWZ qpt q  NR qh 
/0QXY_Q` 3@C 3@' 3@w 3@ 13@l 	+,<CFO $ $' $ -$ 	9:IPQW Ts Tc Tw T ;T( <=LSTZO P# P P' P >P6   )7>>*FGQQS  
 
 	<8	-lKSw Ss S L 9S 
 !F7 F "F 	()DKFO LW L' L *L 
)*ELV_ ,g ,7 , +,8 	67W^_eWf ># > >W > 8> 9:W^_eWf C# C CW C ;C 
+,GNv ( (W ( -(4 78U\]cUd ? ?g ?7 ? 9? 
:;SZ[aSb 6qc 6qG 6q 6q <6qr 
&'BI&/ )7 ) ) ()0 67T[\bTc Cs CW C' C 8C 	%&AH ' w  '& 
&'BI&/ )7 ) ) ()< 34QXY_Q` @C @' @w @ 5@ 
()>Efo (.w (.G (. *(.Z (Wy&$djn 'CUgr  GM  fj  DH  I!8E^py  NT  mp  JN  O&Oh  {D  X^  w{  UY  Z&whst/?fq  FL  ei  CG  H
 /G"Y$djn);KUn  AL  `g  @D  ^b  c+=OYr  EN  bi  BF  `d  e2JX_qz{

 lW*EPYci5PUmq$k=js  MP  jn  o '=bk  EH  be  f
	 <'*EPYci$eko/Zs  FQ  ek  DG  ad  e0BR\n  AJ  ^d  }@  Z]  ^/Zl  H  \b  {~  X[  \+[R_qz  OU  nq  KN  O	
 lW*HS\fl$eko4FWaz  MX  lr  KN  hl  m5GYc|  OX  lr  KO  il  m6HZdv  IR  fl  EI  cg  h/Xj  }H  \b  {  Y]  ^	
 }w*S^gqw5PUmq?Q^hn  AJ  cf  @C  D
 "8=y)%ulpIK\ 
-.CJ6? AG A A /AH |4:A&/ C7 C C 5CL 	#$07 0g 0 %04 	+,CJ6?    -, 
$%>Efo @w @G @ &@4 
#$=DV_ @g @7 @ %@& 	+,8? 	kS 	kg 	k -	k 
%&?Fv    W   '  	%&HOPV  3    g   ' D 	!"@G & &g & #& 
&'DKFO 7AW 7A' 7A (7At 
()FMfo Iww IwG Iw *Iwr   