You are an expert HKMLE tutor helping me ACE the Hong Kong Medical Licensing Examination (Papers 1 and 2). Create a high-yield, comprehensive, beginner-friendly study note for the topic below. You are FULLY AUTHORISED to add any sections, mnemonics, tables, diagrams (text-based), clinical pearls, trap warnings, red flags, drug interactions, trial data, comparisons, flowcharts, quick summaries, or anything else you think will help me ACE this exam. --- DIAGRAM REQUIREMENTS --- If you can generate actual images/diagrams, include them. If not, use clear written descriptions instead of text-based ASCII diagrams. --- REQUIREMENTS --- For each major condition, include: - Definition - Classification (with table where helpful) - Aetiology / Causes (with a BOLD mnemonic) - Pathophysiology (step-by-step, beginner-friendly) - Risk factors (with mnemonic) - Symptoms (with mnemonic) - Signs (with mnemonic) - Investigations (with mnemonic). Provide a prioritised diagnostic algorithm (Bedside → Labs → Imaging). - Management (acute and chronic, with mnemonics for treatment steps). Differentiate standard international guidelines from local Hong Kong Hospital Authority (HA) protocols and Centre for Health Protection (CHP) recommendations. Break down emergency steps into explicit verbal orders. - Complications (with mnemonic where possible) - Prognosis (with mnemonic where possible) --- ADD THESE ELEMENTS THROUGHOUT --- - :warning: HKMLE TRAP boxes (Highlight where standard US/UK textbook answers will cause me to lose marks on Paper 1 & 2) - :office: HA CLINICAL PATHWAY boxes (Specify default drug formulations, staging systems, or referral pathways used in HK public hospitals) - :clipboard: CHP STATUTORY NOTIFICATION boxes (Explicitly flag if the condition is a statutory notifiable infectious disease in HK) - :earth_asia: LOCAL EPIDEMIOLOGY VARIANT boxes (Highlight high-prevalence local variations, e.g., Klebsiella liver abscesses, Recurrent Pyogenic Cholangitis, local Thalassemia/G6PD patterns) - :clipboard: INVESTIGATION INTERPRETATION boxes (Provide a classic raw data result example—e.g., ABG, CSF, ECG—and its 1-sentence interpretation) - :scales: LEGAL & ETHICAL ORDINANCE boxes (Flag relevant local legislation, e.g., Cap. 136 Mental Health Ordinance or mandatory reporting rules) - :pushpin: QUICK SUMMARY boxes - :rotating_light: RED FLAGS box - :question: COMMON EXAM QUESTION box - :microscope: BASIC SCIENCE INTEGRATION box --- REQUIRED TABLES AT THE END --- - :warning: DRUG TRAPS table - :bar_chart: NOTABLE TRIALS table - :brain: MASTER MNEMONICS table - :link: CROSS-MODULE LINKS --- TOPIC --- - Aortic stenosis (AS) — causes (bicuspid, calcific, rheumatic), pathophysiology, symptoms (SAD), signs (slow-rising pulse, narrow pulse pressure, ejection systolic murmur), investigations (Echo, catheterisation), management (TAVI vs SAVR), indications for surgery. Generate the complete ace-level 2-3 pages max pdf note now.
aortic stenosis TAVI SAVR randomized controlled trial
PMID: 38588025
aortic stenosis echocardiogram calcific valve

This diagnostic image is a three-dimensional transesophageal echocardiogram (3D TEE) providing a 'surgeon's view' of the aortic valve. The visual demonstrates severe degenerative calcific aortic stenosis. The three aortic valve leaflets exhibit significant pathological changes, including extensive, heterogeneous calcification visualized as bright, irregular, and thickened echogenic masses. These calcific deposits are widespread across the leaflet tissue and the annulus, resulting in marked structural distortion and restricted leaflet mobility. The central orifice is significantly narrowed, characteristic of high-grade stenosis. Surrounding the calcified valve, there is evidence of tissue remodeling, likely representing fibrosis or lipid deposition associated with advanced valvular heart disease. This image serves as a critical educational tool for identifying structural valvular abnormalities and pre-procedural planning for interventions such as transcatheter aortic valve replacement (TAVR), particularly in assessing annular dimensions and the severity of calcification.

Transthoracic echocardiogram (TTE) composite demonstrating severe degenerative calcific aortic stenosis. Panel (a) shows a 2D parasternal long-axis view where a red arrow highlights the aortic valve, which exhibits bulky, hyperechoic echoes consistent with dense calcification and restricted leaflet mobility. Panel (b) presents an apical five-chamber view with continuous-wave Doppler (CWD) across the aortic valve. The spectral Doppler signal displays a dense, late-peaking parabolic envelope with high velocities reaching approximately 5.5 m/s and a calculated mean transvalvular gradient of 48 mmHg, diagnostic of severe aortic stenosis. A small color Doppler flow map is visible in the upper portion of panel (b), showing high-velocity aliasing at the valve level. The images illustrate key diagnostic criteria for valvular heart disease and hemodynamic assessment in geriatric cardiology.

This diagnostic image is a transthoracic echocardiogram (TTE) in a parasternal short-axis view (PSAX) at the level of the aortic valve. The aortic valve is centrally positioned and identified with a white arrow and text label. Visually, the valve leaflets appear thickened and echo-dense, characteristic of calcific aortic stenosis. The surrounding structures include the right ventricular outflow tract (RVOT) and the left atrium, consistent with standard cardiac orientation in this view. Technical metadata displayed in the periphery includes a scanning frequency of 50Hz, a depth of 15cm, mechanical index (MI) of 1.2, and thermal index (TIS) of 0.4. An electrocardiogram (ECG) tracing at the bottom indicates a heart rate of 105 bpm. This visual is used in medical education to demonstrate the sonographic appearance of aortic stenosis and to teach the anatomical landmarks of the central cardiac base during non-invasive imaging.
mkdir -p /tmp/workspace/hkmle-as && ls /tmp/workspace/hkmle-as/
cat << 'PYEOF' > /tmp/workspace/hkmle-as/generate_pdf.py from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import mm, cm from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether, PageBreak) from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY from reportlab.platypus import Flowable import urllib.request import os # ── colour palette ────────────────────────────────────────────────────────── DARK_BLUE = colors.HexColor('#1A237E') # deep navy MID_BLUE = colors.HexColor('#1565C0') ACCENT = colors.HexColor('#0288D1') GOLD = colors.HexColor('#F57F17') RED = colors.HexColor('#B71C1C') GREEN = colors.HexColor('#1B5E20') ORANGE = colors.HexColor('#E65100') PURPLE = colors.HexColor('#4A148C') TEAL = colors.HexColor('#006064') LIGHT_BLUE = colors.HexColor('#E3F2FD') LIGHT_GOLD = colors.HexColor('#FFF8E1') LIGHT_RED = colors.HexColor('#FFEBEE') LIGHT_GREEN= colors.HexColor('#E8F5E9') LIGHT_PURP = colors.HexColor('#F3E5F5') LIGHT_TEAL = colors.HexColor('#E0F7FA') GREY_BG = colors.HexColor('#F5F5F5') WHITE = colors.white MED_GREY = colors.HexColor('#BDBDBD') DARK_GREY = colors.HexColor('#424242') # ── styles ─────────────────────────────────────────────────────────────────── def make_styles(): base = getSampleStyleSheet() S = {} S['title'] = ParagraphStyle('title', fontName='Helvetica-Bold', fontSize=18, textColor=WHITE, alignment=TA_CENTER, spaceAfter=2, spaceBefore=0, leading=22) S['subtitle'] = ParagraphStyle('subtitle', fontName='Helvetica-Bold', fontSize=10, textColor=LIGHT_BLUE, alignment=TA_CENTER, spaceAfter=2, leading=13) S['h1'] = ParagraphStyle('h1', fontName='Helvetica-Bold', fontSize=11, textColor=WHITE, spaceAfter=3, spaceBefore=6, leading=14, leftIndent=0) S['h2'] = ParagraphStyle('h2', fontName='Helvetica-Bold', fontSize=9.5, textColor=DARK_BLUE, spaceAfter=2, spaceBefore=5, leading=12) S['h3'] = ParagraphStyle('h3', fontName='Helvetica-Bold', fontSize=8.5, textColor=MID_BLUE, spaceAfter=1, spaceBefore=3, leading=11) S['body'] = ParagraphStyle('body', fontName='Helvetica', fontSize=7.8, textColor=DARK_GREY, spaceAfter=2, spaceBefore=1, leading=10.5, alignment=TA_JUSTIFY) S['bodyB'] = ParagraphStyle('bodyB', fontName='Helvetica-Bold', fontSize=7.8, textColor=DARK_GREY, spaceAfter=2, spaceBefore=1, leading=10.5) S['bullet'] = ParagraphStyle('bullet', fontName='Helvetica', fontSize=7.6, textColor=DARK_GREY, spaceAfter=1, spaceBefore=0, leading=10, leftIndent=10, bulletIndent=2) S['mnemonic'] = ParagraphStyle('mnemonic', fontName='Helvetica-Bold', fontSize=8, textColor=PURPLE, spaceAfter=2, spaceBefore=2, leading=11, leftIndent=4, borderPad=3) S['box_title'] = ParagraphStyle('box_title', fontName='Helvetica-Bold', fontSize=8, textColor=WHITE, spaceAfter=1, leading=10) S['box_body'] = ParagraphStyle('box_body', fontName='Helvetica', fontSize=7.5, textColor=DARK_GREY, spaceAfter=1, leading=10, leftIndent=2) S['box_bodyB'] = ParagraphStyle('box_bodyB', fontName='Helvetica-Bold', fontSize=7.5, textColor=DARK_GREY, spaceAfter=1, leading=10, leftIndent=2) S['table_hdr'] = ParagraphStyle('table_hdr', fontName='Helvetica-Bold', fontSize=7.5, textColor=WHITE, alignment=TA_CENTER, leading=10) S['table_cell'] = ParagraphStyle('table_cell', fontName='Helvetica', fontSize=7.3, textColor=DARK_GREY, leading=10) S['table_cellB'] = ParagraphStyle('table_cellB', fontName='Helvetica-Bold', fontSize=7.3, textColor=DARK_GREY, leading=10) S['warn'] = ParagraphStyle('warn', fontName='Helvetica-Bold', fontSize=7.5, textColor=RED, spaceAfter=1, leading=10, leftIndent=4) S['small'] = ParagraphStyle('small', fontName='Helvetica', fontSize=7, textColor=DARK_GREY, spaceAfter=1, leading=9) S['footer'] = ParagraphStyle('footer', fontName='Helvetica', fontSize=6.5, textColor=MED_GREY, alignment=TA_CENTER, leading=8) return S # ── helper flowables ───────────────────────────────────────────────────────── def section_header(title, bg_color, styles): data = [[Paragraph(title, styles['h1'])]] t = Table(data, colWidths=[175*mm]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), bg_color), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 8), ('RIGHTPADDING', (0,0), (-1,-1), 4), ('ROUNDEDCORNERS', [3, 3, 3, 3]), ])) return t def box(icon, title, content_paras, bg_color, title_color, styles, width=175*mm): header_data = [[Paragraph(f"{icon} {title}", styles['box_title'])]] header_t = Table(header_data, colWidths=[width]) header_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), title_color), ('TOPPADDING', (0,0), (-1,-1), 3), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 6), ('RIGHTPADDING', (0,0), (-1,-1), 4), ])) body_data = [[p] for p in content_paras] body_t = Table(body_data, colWidths=[width]) body_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), bg_color), ('TOPPADDING', (0,0), (-1,-1), 2), ('BOTTOMPADDING', (0,0), (-1,-1), 2), ('LEFTPADDING', (0,0), (-1,-1), 6), ('RIGHTPADDING', (0,0), (-1,-1), 4), ('BOX', (0,0), (-1,-1), 0.5, title_color), ])) return [header_t, body_t] def two_col(left_items, right_items, styles, lw=87*mm, rw=87*mm, gap=1*mm): """Build a two-column block from lists of flowables represented as cell content.""" row = [[left_items, right_items]] t = Table(row, colWidths=[lw, rw], hAlign='LEFT') t.setStyle(TableStyle([ ('VALIGN', (0,0), (-1,-1), 'TOP'), ('LEFTPADDING', (0,0), (-1,-1), 0), ('RIGHTPADDING', (0,0), (-1,-1), 3), ('TOPPADDING', (0,0), (-1,-1), 0), ('BOTTOMPADDING', (0,0), (-1,-1), 0), ])) return t def mnemonic_box(label, items, styles): lines = [Paragraph(f"<b>{label}</b>", styles['mnemonic'])] for item in items: lines.append(Paragraph(f"• {item}", styles['bullet'])) data = [[lines]] t = Table(data, colWidths=[175*mm]) t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), LIGHT_PURP), ('BOX', (0,0), (-1,-1), 1, PURPLE), ('TOPPADDING', (0,0), (-1,-1), 4), ('BOTTOMPADDING', (0,0), (-1,-1), 4), ('LEFTPADDING', (0,0), (-1,-1), 6), ('RIGHTPADDING', (0,0), (-1,-1), 6), ])) return t def simple_table(header, rows, col_widths, styles, header_bg=DARK_BLUE): data = [[Paragraph(h, styles['table_hdr']) for h in header]] for row in rows: data.append([Paragraph(str(c), styles['table_cell']) for c in row]) t = Table(data, colWidths=col_widths, repeatRows=1) ts = TableStyle([ ('BACKGROUND', (0,0), (-1,0), header_bg), ('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LIGHT_BLUE]), ('GRID', (0,0), (-1,-1), 0.3, MED_GREY), ('TOPPADDING', (0,0), (-1,-1), 3), ('BOTTOMPADDING', (0,0), (-1,-1), 3), ('LEFTPADDING', (0,0), (-1,-1), 4), ('RIGHTPADDING', (0,0), (-1,-1), 4), ('VALIGN', (0,0), (-1,-1), 'TOP'), ]) t.setStyle(ts) return t # ───────────────────────────────────────────────────────────────────────────── # DOCUMENT BUILD # ───────────────────────────────────────────────────────────────────────────── OUTPUT = '/tmp/workspace/hkmle-as/HKMLE_Aortic_Stenosis.pdf' doc = SimpleDocTemplate(OUTPUT, pagesize=A4, leftMargin=15*mm, rightMargin=15*mm, topMargin=14*mm, bottomMargin=14*mm) S = make_styles() story = [] # ══════════════════════════════════════════════════════════════════════════════ # TITLE BANNER # ══════════════════════════════════════════════════════════════════════════════ title_data = [ [Paragraph("HKMLE HIGH-YIELD STUDY NOTE", S['subtitle'])], [Paragraph("AORTIC STENOSIS (AS)", S['title'])], [Paragraph("Paper 1 & 2 | Cardiology | Ace-Level Reference | August 2026", S['subtitle'])], ] title_t = Table(title_data, colWidths=[175*mm]) title_t.setStyle(TableStyle([ ('BACKGROUND', (0,0), (-1,-1), DARK_BLUE), ('TOPPADDING', (0,0), (-1,-1), 5), ('BOTTOMPADDING', (0,0), (-1,-1), 5), ('LEFTPADDING', (0,0), (-1,-1), 8), ('RIGHTPADDING', (0,0), (-1,-1), 8), ])) story.append(title_t) story.append(Spacer(1, 3*mm)) # ══════════════════════════════════════════════════════════════════════════════ # QUICK SUMMARY BOX # ══════════════════════════════════════════════════════════════════════════════ qs = box("📌", "QUICK SUMMARY", [Paragraph("AS = obstruction to LV outflow at the aortic valve. The most common valvular heart disease in developed countries. Severe AS: AVA <1 cm², mean gradient ≥40 mmHg, Vmax ≥4 m/s. Cardinal symptoms: <b>SAD</b> (Syncope, Angina, Dyspnoea). Once symptomatic: median survival 2-3 years without intervention. Treatment: AVR (SAVR or TAVI) — NO effective medical therapy.", S['box_body']), Paragraph("<b>DO NOT</b> use ACE-inhibitors, vasodilators, or nitrates in severe AS — may cause haemodynamic collapse.", S['warn'])], LIGHT_BLUE, ACCENT, S) story.extend(qs) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 1: DEFINITION & CLASSIFICATION # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("1. DEFINITION & CLASSIFICATION", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) story.append(Paragraph("Aortic stenosis is narrowing of the aortic valve orifice causing obstruction to LV outflow, leading to pressure overload, concentric LV hypertrophy, and ultimately heart failure.", S['body'])) story.append(Spacer(1, 1*mm)) # Classification table cls_header = ["Type", "AVA (cm²)", "Mean Gradient", "Vmax (m/s)", "Notes"] cls_rows = [ ["Mild", "1.5–2.0", "<20 mmHg", "<3.0", "Usually asymptomatic"], ["Moderate", "1.0–1.5", "20–40 mmHg", "3.0–4.0", "Watch for symptoms"], ["Severe", "<1.0 (<0.6/m²BSA)", "≥40 mmHg", "≥4.0", "Operate when symptomatic"], ["Very Severe", "<0.6", "≥60 mmHg", "≥5.0", "Consider early surgery even if asymptomatic"], ] story.append(Paragraph("<b>Echo Severity Classification (AHA/ACC 2020)</b>", S['h3'])) story.append(simple_table(cls_header, cls_rows, [28*mm, 28*mm, 32*mm, 28*mm, 59*mm], S)) story.append(Spacer(1, 1*mm)) # Disease stage classification stage_header = ["ACC/AHA Stage", "Description", "Key Features"] stage_rows = [ ["A – At Risk", "Risk factors present", "Bicuspid AV, HTN, hyperlipidaemia — no obstruction"], ["B – Progressive", "Mild-moderate, asymptomatic", "Vmax 2.0–3.9 m/s; normal EF; no symptoms"], ["C1 – Severe Asymptomatic", "Severe AS; EF preserved", "AVA <1 cm²; Vmax ≥4 m/s; no symptoms; EF ≥50%"], ["C2 – Severe Asymptomatic", "Severe AS; EF depressed", "AVA <1 cm²; EF <50%"], ["D1 – Symptomatic High Gradient", "Severe AS; SAD symptoms", "Mean gradient ≥40 mmHg; Class I indication for AVR"], ["D2 – Low-Flow Low-Gradient, Low EF", "Severe AS; EF <50%", "AVA <1 cm²; mean gradient <40 mmHg — use dobutamine stress echo"], ["D3 – Paradoxical Low-Flow Low-Gradient", "Severe AS; EF normal", "AVA <1 cm²; gradient <40 mmHg; small LV; preserved EF — challenging!"], ] story.append(Paragraph("<b>Disease Staging (ACC/AHA)</b>", S['h3'])) story.append(simple_table(stage_header, stage_rows, [36*mm, 45*mm, 94*mm], S)) story.append(Spacer(1, 2*mm)) # HKMLE TRAP box trap1 = box("⚠️", "HKMLE TRAP #1 — Gradient vs Area", [Paragraph("Many US/UK resources define severe AS by <b>mean gradient ≥40 mmHg alone</b>. HKMLE often uses <b>AVA <1.0 cm²</b> as the primary criterion. In low-flow states (D2/D3), the gradient can be <40 mmHg despite truly severe AS — do NOT exclude severe AS based on gradient alone. Use <b>dobutamine stress echo</b> to distinguish true vs pseudo-severe AS in D2.", S['box_body'])], LIGHT_RED, RED, S) story.extend(trap1) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 2: AETIOLOGY / CAUSES # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("2. AETIOLOGY / CAUSES", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) aetio_header = ["Cause", "Age of Presentation", "Key Features", "% of SAVR cases"] aetio_rows = [ ["Calcific/Degenerative\n(Senile)", "≥65 years", "Calcium deposition on tricuspid AV; shares risk factors with atherosclerosis", "~50% (tricuspid)"], ["Congenital Bicuspid AV (BAV)", "40–60 years", "Most common congenital heart defect (1–2% population); presents 1–2 decades earlier than calcific; associated with aortic coarctation, aortic root dilation", ">50% overall;\n~65% in <70 yrs"], ["Rheumatic Heart Disease", "30–50 years (HK: may present later)", "Commissural fusion + leaflet thickening; almost always co-exists with mitral valve disease; leaflets fuse at tips", "~10% in developed;\nhigher in HK/Asia"], ["Rare: Congenital unicuspid", "Childhood/adolescence", "Presents in infancy or early adulthood", "Rare"], ["Rare: SLE, Paget's disease,\nhomozygous hypercholesterolaemia", "Variable", "Nodular deposits; rare causes", "Very rare"], ] story.append(simple_table(aetio_header, aetio_rows, [38*mm, 30*mm, 72*mm, 35*mm], S)) story.append(Spacer(1, 1*mm)) story.append(mnemonic_box("MNEMONIC — Causes of AS: 'B-C-R-R'", ["B – Bicuspid aortic valve (most common overall in surgical series; earlier onset)", "C – Calcific/degenerative (most common in >65 yrs)", "R – Rheumatic (always check mitral valve too!)", "R – Rare causes (congenital unicuspid, SLE, Paget's, homozygous FH)"])) story.append(Spacer(1, 1*mm)) local1 = box("🌏", "LOCAL EPIDEMIOLOGY — Hong Kong", [Paragraph("Rheumatic heart disease remains more prevalent in HK/South-East Asia than in Western countries due to historical group A Streptococcus exposure. <b>Always examine the mitral valve</b> when AS is suspected in HK patients — mixed mitral/aortic disease from rheumatic aetiology is common. In the HK elderly population, calcific AS is the dominant cause. BAV prevalence is similar globally (~1–2% of population).", S['box_body'])], LIGHT_TEAL, TEAL, S) story.extend(local1) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 3: PATHOPHYSIOLOGY # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("3. PATHOPHYSIOLOGY (Step-by-Step)", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) path_steps = [ ("Step 1: Valve Narrowing", "Reduced AVA → increased resistance to LV outflow → LV must generate higher pressure to eject blood (pressure overload)."), ("Step 2: Concentric LVH", "Laplace's law: to maintain wall stress (σ = Pr/2h), LV increases wall thickness (h) → concentric hypertrophy. This is initially compensatory."), ("Step 3: Diastolic Dysfunction", "Hypertrophied, stiff LV → impaired relaxation → elevated LV end-diastolic pressure (LVEDP) → pulmonary congestion → DYSPNOEA. Atrial kick becomes critical — loss of sinus rhythm (AF) can precipitate acute decompensation."), ("Step 4: Angina", "Increased myocardial O2 demand (hypertrophy) + reduced supply (reduced capillary density, increased filling pressure, reduced coronary driving pressure) → subendocardial ischaemia → ANGINA even without CAD."), ("Step 5: Syncope", "Fixed low cardiac output + vasodilation on exercise → hypotension → cerebral hypoperfusion → SYNCOPE. Also caused by arrhythmias."), ("Step 6: Systolic Dysfunction (Late)", "Progressive afterload excess eventually overwhelms compensatory LVH → LV dilation → reduced EF → frank heart failure. This is a late, pre-terminal stage."), ("Step 7: Death", "Natural history: once symptomatic, without AVR — Angina = ~5 yr survival; Syncope = ~3 yr; Heart Failure = ~1–2 yr survival."), ] for title, desc in path_steps: story.append(Paragraph(f"<b>{title}:</b> {desc}", S['body'])) story.append(Spacer(1, 1*mm)) sci_box = box("🔬", "BASIC SCIENCE INTEGRATION", [Paragraph("<b>Calcification mechanism:</b> Not passive — involves active bone-like mineralisation. Endothelial disruption → lipid infiltration → macrophage activation → VIC (valve interstitial cell) osteoblastic differentiation → hydroxyapatite deposition. Key pathways: OPG-RANKL, Wnt-LRP5. This is why AS shares risk factors with atherosclerosis but statins do NOT slow progression once calcification is established.", S['box_body']), Paragraph("<b>Pressure-volume loop in AS:</b> Shifted left and upward — narrow loop, high peak pressure, reduced stroke volume in late disease. Concentric LVH = small LV cavity + thick walls.", S['box_body'])], LIGHT_GREEN, GREEN, S) story.extend(sci_box) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 4: RISK FACTORS # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("4. RISK FACTORS", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) story.append(mnemonic_box("MNEMONIC — Risk Factors for Calcific AS: 'OLD DASH'", ["O – Old age (>65 years)", "L – LDL / Dyslipidaemia (especially Lp(a) — strongest lipid predictor)", "D – Diabetes mellitus", "D – Dialysis / Chronic Kidney Disease (Ca-PO4 dysregulation)", "A – Arterial hypertension", "S – Smoking", "H – Haemodialysis / male sex (male:female ~2:1 for calcific AS)"])) story.append(Paragraph("Additional: Congenital BAV, hyperphosphataemia, metabolic syndrome, prior radiation therapy to chest.", S['body'])) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 5: SYMPTOMS & SIGNS # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("5. SYMPTOMS & SIGNS", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) # Two column layout — symptoms left, signs right symp_content = [ Paragraph("<b>Cardinal Symptoms — SAD</b>", S['h3']), Paragraph("<b>S</b> – Syncope (exertional; fixed CO + vasodilation)", S['bullet']), Paragraph("<b>A</b> – Angina (even without CAD; ~50% have coexistent CAD >65 yrs)", S['bullet']), Paragraph("<b>D</b> – Dyspnoea (exertional → orthopnoea → PND → pulmonary oedema — late)", S['bullet']), Spacer(1, 2*mm), Paragraph("<b>Prognosis after symptom onset (no AVR):</b>", S['h3']), Paragraph("• Angina: ~5 years median survival", S['bullet']), Paragraph("• Syncope: ~3 years", S['bullet']), Paragraph("• HF/Dyspnoea: ~1–2 years", S['bullet']), Spacer(1, 2*mm), Paragraph("<b>Late symptoms:</b> fatigue, cachexia, peripheral cyanosis, signs of RV failure (TR, ascites, oedema) — occur only when LV systolic function is severely compromised.", S['box_body']), ] sign_content = [ Paragraph("<b>Key Signs — 'SPEAK'</b>", S['h3']), Paragraph("<b>S</b> – Slow-rising, low-volume pulse (pulsus parvus et tardus)", S['bullet']), Paragraph("<b>P</b> – Pulse pressure NARROW (late finding — as SV drops)", S['bullet']), Paragraph("<b>E</b> – Ejection systolic murmur (harsh, crescendo-decrescendo; 2nd RICS; radiates to carotids; late-peaking = more severe)", S['bullet']), Paragraph("<b>A</b> – A2 diminished / absent (calcified valve); Paradoxical S2 splitting (severe AS)", S['bullet']), Paragraph("<b>K</b> – Keep checking for S4 gallop (LVH, elevated LVEDP)", S['bullet']), Spacer(1, 1*mm), Paragraph("<b>Other signs:</b>", S['h3']), Paragraph("• Heaving, non-displaced apex beat (LVH) — displaced apex = LV dilation (late/decompensated)", S['bullet']), Paragraph("• Systolic thrill at base / carotids", S['bullet']), Paragraph("• Gallavardin phenomenon: murmur radiates to apex — mimics MR (musical quality at apex; harsh at base)", S['bullet']), ] col_t = two_col(symp_content, sign_content, S, lw=87*mm, rw=87*mm) story.append(col_t) story.append(Spacer(1, 1*mm)) trap2 = box("⚠️", "HKMLE TRAP #2 — Pulse & Age", [Paragraph("In ELDERLY patients, arterial stiffness masks the slow-rising pulse — the carotid upstroke may appear NORMAL even in severe AS. Do NOT exclude severe AS based on a 'normal-feeling' pulse in an elderly patient. <b>Echo is the gold standard, not the clinical examination.</b>", S['box_body']), Paragraph("Also: A LOUD murmur does NOT equal severe AS. A soft murmur in a patient with low CO (end-stage) can represent VERY severe AS.", S['warn'])], LIGHT_RED, RED, S) story.extend(trap2) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 6: INVESTIGATIONS # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("6. INVESTIGATIONS — Diagnostic Algorithm", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) story.append(Paragraph("<b>MNEMONIC — Investigations: 'B-E-C-A-C'</b>", S['mnemonic'])) story.append(Paragraph("B – Bedside (ECG, CXR) → E – Echo (TTE: gold standard) → C – CT calcium score (if discordant) → A – Angio (Coronary; pre-SAVR) → C – Catheterisation (invasive; rarely needed now)", S['body'])) story.append(Spacer(1, 1*mm)) inv_header = ["Level", "Investigation", "Key Findings in Severe AS"] inv_rows = [ ["BEDSIDE", "ECG", "LVH (Sokolow-Lyon: S V1 + R V5/6 ≥35mm); LV strain (ST↓, T-wave inversion I, aVL, V5-V6); LAD; LBBB (late)"], ["BEDSIDE", "CXR", "Normal cardiac silhouette (concentric LVH – NOT cardiomegaly); aortic valve calcification (lateral view); post-stenotic aortic root dilation; pulmonary congestion (late)"], ["LABS", "BNP / NT-proBNP", "Elevated BNP (>3x upper limit) = poor prognosis in asymptomatic severe AS → consider earlier surgery"], ["LABS", "FBC, U&E, LFTs, Coags", "Pre-operative baseline; anaemia worsens AS prognosis"], ["IMAGING", "TTE (GOLD STANDARD)", "AVA <1 cm² (continuity equation); Vmax ≥4 m/s; mean gradient ≥40 mmHg; LVH; LV function; EF"], ["IMAGING", "TOE/3D Echo", "Better valve morphology; pre-TAVI annulus sizing (annular diameter crucial for prosthesis selection)"], ["IMAGING", "CT Cardiac (MDCT)", "Aortic valve calcium score (AVC); vascular access for TAVI planning; aortic root anatomy; AVC >2000 AU (Agatston) = severe in men, >1200 AU in women"], ["IMAGING", "Dobutamine Stress Echo", "For Stage D2 (low-flow, low-gradient, reduced EF): true severe AS shows ↑ gradient AND ↑ flow; pseudo-severe shows ↑ flow but gradient remains low"], ["INVASIVE", "Cardiac Catheterisation", "Rarely needed; use if discordance between clinical/echo; direct Gorlin formula AVA measurement"], ["INVASIVE", "Coronary Angiography", "Mandatory pre-SAVR (men >40, women >50, or if symptoms suggest CAD); also before TAVI if high CAD risk"], ] story.append(simple_table(inv_header, inv_rows, [22*mm, 38*mm, 115*mm], S)) story.append(Spacer(1, 1*mm)) interp_box = box("📋", "INVESTIGATION INTERPRETATION EXAMPLE", [Paragraph("<b>Echo report:</b> Aortic valve: severely thickened, calcified leaflets with restricted opening. Peak velocity 4.8 m/s. Mean gradient 52 mmHg. Continuity equation AVA = 0.7 cm²/0.4 cm²/m² BSA. EF 60%. LVH present.", S['box_body']), Paragraph("<b>Interpretation:</b> Stage D1 severe AS (high-gradient, preserved EF, symptomatic) — Class I indication for AVR (SAVR or TAVI depending on risk/age).", S['box_bodyB']), Spacer(1, 1*mm), Paragraph("<b>ECG example:</b> Sinus rhythm. Left axis deviation. QRS 90ms. S in V1 = 18mm; R in V5 = 24mm → Sokolow-Lyon = 42mm (LVH). ST depression + T-wave inversion in I, aVL, V5-6 = LV strain pattern.", S['box_body']), Paragraph("<b>Interpretation:</b> LVH with strain = consistent with severe pressure overload from AS.", S['box_bodyB'])], LIGHT_GOLD, GOLD, S) story.extend(interp_box) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 7: MANAGEMENT # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("7. MANAGEMENT", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) story.append(Paragraph("<b>7A. Medical Management (No curative medical therapy)</b>", S['h2'])) med_rows = [ ["Cardiovascular risk factors", "Treat HTN (gently — avoid excess BP reduction), statin for ASCVD prevention (NOT to slow AS progression)", "Statins do NOT slow AS calcification once established (SEAS, SALTIRE trials — NEGATIVE for AS progression)"], ["RAAS inhibition", "ACEi/ARB may be used cautiously for HTN IF NO significant AS — AVOID in severe AS", "Vasodilation → ↓ preload/afterload → haemodynamic collapse in fixed obstruction"], ["Diuretics", "Use cautiously for pulmonary congestion (acute HF)", "AS is preload-dependent — over-diuresis → ↓CO → syncope"], ["AF management", "Rate/rhythm control; anticoagulation if CHA₂DS₂-VASc ≥2", "AF poorly tolerated in AS — loss of atrial kick → acute decompensation"], ["Endocarditis prophylaxis", "Only if prior history of infective endocarditis", "Routine IE prophylaxis no longer recommended for AS alone"], ["Anti-anginal drugs", "Beta-blockers CAUTIOUSLY (avoid negative inotropy in decompensated); nitrates AVOIDED (vasodilation → syncope)", "HKMLE TRAP: GTN spray contraindicated in known severe AS"], ] med_header = ["Indication", "Management", "Caveat / Trap"] story.append(simple_table(med_header, med_rows, [40*mm, 70*mm, 65*mm], S, header_bg=TEAL)) story.append(Spacer(1, 1*mm)) story.append(Paragraph("<b>7B. Indications for Intervention (AVR — SAVR or TAVI)</b>", S['h2'])) ind_header = ["Indication", "Class", "Notes"] ind_rows = [ ["Symptomatic severe AS (D1: SAD + Vmax ≥4 m/s OR AVA <1 cm²)", "Class I (Level B)", "STRONGEST indication — operate within 1–3 months of symptom onset"], ["Symptomatic low-flow, low-gradient AS with reduced EF (D2) — true severe on DSE", "Class I (Level B)", "High peri-op risk; prefer TAVI if technically feasible"], ["Symptomatic paradoxical low-flow, low-gradient AS with preserved EF (D3)", "Class IIa (Level B)", "Challenging — multidisciplinary heart team decision"], ["Asymptomatic severe AS + LVEF <50% (C2)", "Class I (Level B)", "EF depression = ventricle is decompensating"], ["Asymptomatic severe AS undergoing other cardiac surgery (CABG, other valve)", "Class I (Level C)", "Concurrent AVR at time of other cardiac surgery"], ["Asymptomatic very severe AS (Vmax ≥5 m/s) + low surgical risk", "Class IIa (Level B)", "Consider early surgery before symptoms develop"], ["Asymptomatic severe AS + very rapid progression (≥0.3 m/s/year)", "Class IIa (Level C)", "High risk of sudden death"], ["Asymptomatic severe AS + BNP >3x upper limit + low surgical risk", "Class IIb (Level B)", "Emerging indication — serial BNP monitoring in AS clinics"], ["Asymptomatic severe AS + abnormal exercise test (symptoms, BP fall >10 mmHg)", "Class IIa (Level B)", "Exercise testing SAFE and should be performed in asymptomatic severe AS"], ] story.append(simple_table(ind_header, ind_rows, [75*mm, 28*mm, 72*mm], S)) story.append(Spacer(1, 1*mm)) story.append(Paragraph("<b>7C. TAVI vs SAVR — Choosing the Right Procedure</b>", S['h2'])) tavi_header = ["Factor", "Favours TAVI", "Favours SAVR"] tavi_rows = [ ["Age", "Older (>75 yrs); life expectancy <10 yrs", "Younger (<65 yrs); longer expected survival"], ["Surgical risk (STS score)", "High/prohibitive (>8%) or intermediate", "Low risk (<4%) — though TAVI non-inferior at 1 yr (DEDICATE 2024)"], ["Anatomy", "Suitable annular size; no severe BAV; transfemoral access feasible", "Bicuspid AV (excluded from most RCTs); small annulus; need concurrent CABG"], ["Concomitant CAD", "PCI feasible (TCW trial 2025: TAVI+PCI non-inferior to SAVR+CABG)", "Complex/multivessel CAD preferring CABG"], ["Durability concern", "Less of a concern in elderly (unlikely to outlive valve)", "Younger patients: SAVR valves have longer track record; TAVI durability data to 10 yrs emerging (NOTION 2024: similar at 10 yrs)"], ["Pacemaker risk", "Higher with TAVI (~10–20%; esp. self-expanding)", "Lower (~2–3%)"], ["Stroke risk", "Slightly higher early stroke risk (TAVI) — being reduced with newer devices", "Lower stroke rate in most trials"], ["Paravalvular leak", "Higher with TAVI (mild PVL ~20%; moderate+ ~5%)", "Rare with SAVR"], ["Access", "Transfemoral preferred; avoid if severe iliofemoral disease", "Median sternotomy; higher in frail/elderly"], ["Patient preference", "Avoidance of open surgery; faster recovery", "Preference for durable mechanical solution"], ] story.append(simple_table(tavi_header, tavi_rows, [38*mm, 68*mm, 69*mm], S)) story.append(Spacer(1, 1*mm)) ha_box = box("🏢", "HA CLINICAL PATHWAY — Hong Kong", [Paragraph("<b>Heart Team approach:</b> All patients being considered for AVR in HK public hospitals are assessed by a multidisciplinary team (MDT) including cardiologist, cardiothoracic surgeon, anaesthetist, geriatrician (if >75/frail), and imaging specialist.", S['box_body']), Paragraph("<b>TAVI availability:</b> TAVI is available at designated HA cardiac centres (QMH, PWH, Prince of Wales Hospital). Balloon-expandable (Edwards SAPIEN) and self-expanding (Medtronic CoreValve/Evolut) platforms used.", S['box_body']), Paragraph("<b>Risk scoring:</b> HA uses both <b>STS PROM score</b> and <b>EuroSCORE II</b> for surgical risk stratification. Frailty assessment (Clinical Frailty Scale) is mandatory before TAVI referral.", S['box_body']), Paragraph("<b>TAVI currently recommended for:</b> (1) Symptomatic severe AS at high/prohibitive surgical risk; (2) Patients >80 years; (3) Patients with STS >8% or EuroSCORE II >8%; (4) Patients with factors increasing surgical risk (porcelain aorta, prior chest radiation, hostile chest). Extended to low-intermediate risk patients in recent HA guidance following landmark trials.", S['box_body']), Paragraph("<b>Post-TAVI antithrombotic protocol:</b> Aspirin 100 mg OD indefinitely + Clopidogrel 75 mg OD for 3–6 months (dual antiplatelet). Single antiplatelet if high bleeding risk.", S['box_bodyB'])], LIGHT_BLUE, ACCENT, S) story.extend(ha_box) story.append(Spacer(1, 1*mm)) story.append(Paragraph("<b>7D. Acute Management — AS in Emergency (Acute Decompensated HF)</b>", S['h2'])) emerg_steps = [ "1. CALL FOR HELP — cardiology consult STAT; ICU/HDU bed", "2. ABC — High-flow O2, IV access x2, continuous cardiac monitoring, SpO2, BP", "3. Position — Sit patient upright (30–45°)", "4. IV morphine 2–4 mg SLOWLY (anxiety, preload reduction) — CAUTION: hypotension risk", "5. IV frusemide 40–80 mg slowly (pulmonary oedema) — CAUTION: over-diuresis worsens CO", "6. AVOID vasodilators (GTN, nitroprusside) — precipitates haemodynamic collapse", "7. AVOID inotropes (e.g. dobutamine) UNLESS cardiac shock — use only under expert supervision", "8. If cardiogenic shock: Intra-aortic balloon pump (IABP) as bridge to urgent AVR", "9. Urgent echo — confirm diagnosis, assess EF, exclude other causes", "10. Urgent TAVI/SAVR — definitive treatment; consider balloon aortic valvuloplasty as bridge if TAVI/SAVR not immediately available", ] for step in emerg_steps: story.append(Paragraph(f"{'⚠️' if 'AVOID' in step else '▶'} {step}", S['bullet'])) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 8: COMPLICATIONS # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("8. COMPLICATIONS", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) story.append(mnemonic_box("MNEMONIC — Complications of AS: 'CHEF'", ["C – Cardiac failure (HF — diastolic then systolic; the final common pathway)", "C – Conduction defects (LBBB, CHB — especially with calcification extending to conduction system; also post-TAVI/SAVR pacemaker requirement)", "H – Haemodyna mic collapse / Sudden cardiac death (2–3% per year in asymptomatic severe AS; up to 15% at 8 yrs if untreated)", "E – Embolism (calcium emboli → stroke, TIA, renal/splenic infarcts; Heyde's syndrome: acquired von Willebrand deficiency → GI bleeding from AVMs)", "F – Failure of repair (infective endocarditis; prosthetic valve complications: thrombosis, SVD, PPM — Patient-Prosthesis Mismatch)"])) story.append(Spacer(1, 1*mm)) trap3 = box("⚠️", "HKMLE TRAP #3 — Heyde's Syndrome", [Paragraph("<b>Heyde's syndrome:</b> AS + GI angiodysplasia + GI bleeding. Mechanism: shear stress across stenotic valve destroys high-molecular-weight von Willebrand factor multimers (HMW-vWF) → acquired type 2A von Willebrand disease → bleeding from bowel AVMs. <b>Treatment:</b> AVR — resolves the coagulopathy. This is a classic HKMLE/MRCP cross-linking trap between haematology and cardiology.", S['box_body'])], LIGHT_RED, RED, S) story.extend(trap3) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # SECTION 9: PROGNOSIS # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("9. PROGNOSIS", MID_BLUE, S)) story.append(Spacer(1, 1*mm)) prog_header = ["Scenario", "Key Prognostic Data"] prog_rows = [ ["Asymptomatic severe AS", "Annual risk of sudden death ~2–3%; progression to symptoms ~25% per year → median symptom-free survival ~2 years once Vmax ≥4 m/s"], ["Symptomatic AS (no AVR)", "Angina: median 5 yrs; Syncope: 3 yrs; HF: 1–2 yrs → 50% dead at 2 years"], ["After SAVR (low risk)", "5-year survival ~95%; 8-year survival ~85–90%; operative mortality <1–2% at low-risk centres"], ["After TAVI (low risk — PARTNER 3, 2019)", "TAVI non-inferior to SAVR; 30-day death/stroke/re-hospitalisation LOWER with TAVI (8.5% vs 15.1%); 5-year outcomes similar"], ["NOTION trial (10-year, 2024)", "TAVI vs SAVR in all-comers (majority low-risk): similar all-cause mortality, stroke, and MI at 10 years — TAVI durability validated"], ["DEDICATE trial (2024, NEJM)", "74-year-olds, low/intermediate risk: TAVI non-inferior to SAVR for death/stroke at 1 year (5.4% vs 10.0%); TAVI actually superior numerically"], ["Poor prognostic markers", "EF <50%, AF, low-flow low-gradient AS, frailty, significant MR, severe LVH, pulmonary hypertension, renal dysfunction"], ] story.append(simple_table(prog_header, prog_rows, [50*mm, 125*mm], S)) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # RED FLAGS # ══════════════════════════════════════════════════════════════════════════════ rf = box("🚨", "RED FLAGS — Refer/Act Immediately", [Paragraph("• <b>Syncope or near-syncope</b> in a patient with known AS — urgent cardiology referral (risk of sudden death)", S['box_body']), Paragraph("• <b>Acute pulmonary oedema</b> in severe AS — avoid vasodilators; consider TAVI/SAVR urgently", S['box_body']), Paragraph("• <b>New LBBB</b> in severe AS — may indicate calcification into conduction system or post-AVR need for PPM", S['box_body']), Paragraph("• <b>Worsening dyspnoea with normal EF</b> — do NOT dismiss as non-cardiac; may be D3 paradoxical low-flow AS", S['box_body']), Paragraph("• <b>Sudden loss of previously detected murmur</b> in decompensated patient — soft murmur ≠ mild disease in low-CO state", S['warn']), Paragraph("• <b>Haematochezia / GI bleeding</b> in AS patient — suspect Heyde's syndrome (acquired vWD)", S['box_body'])], LIGHT_RED, RED, S) story.extend(rf) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # COMMON EXAM QUESTIONS # ══════════════════════════════════════════════════════════════════════════════ exam_q = box("❓", "COMMON HKMLE EXAM QUESTIONS", [Paragraph("<b>Q1:</b> 72-year-old with exertional syncope, slow-rising pulse, harsh ejection systolic murmur at 2nd RICS radiating to carotids, soft A2. Echo: AVA 0.8 cm², mean gradient 48 mmHg, EF 62%. Best management?", S['box_body']), Paragraph("<b>A:</b> AVR (SAVR or TAVI based on heart team assessment) — Class I indication. Symptomatic severe AS (D1).", S['box_bodyB']), Spacer(1, 1*mm), Paragraph("<b>Q2:</b> Same patient, but AVA 0.7 cm², mean gradient 32 mmHg, EF 38%. Whats the next step?", S['box_body']), Paragraph("<b>A:</b> Dobutamine stress echocardiography — Stage D2 (low-flow, low-gradient, reduced EF). Need to distinguish true severe AS (↑gradient + ↑flow on dobutamine) from pseudo-severe AS (↑flow but low gradient persists).", S['box_bodyB']), Spacer(1, 1*mm), Paragraph("<b>Q3:</b> 65-year-old with AS referred for CABG. AVA 0.9 cm², no cardiac symptoms. Should the aortic valve be replaced at the same time?", S['box_body']), Paragraph("<b>A:</b> YES — Class I indication for concurrent AVR when undergoing other cardiac surgery with severe AS (even if asymptomatic).", S['box_bodyB']), Spacer(1, 1*mm), Paragraph("<b>Q4:</b> Why should you NOT give GTN to a patient with chest pain who has known severe AS?", S['box_body']), Paragraph("<b>A:</b> GTN causes venous dilation → ↓preload → ↓CO across a fixed obstruction → severe hypotension and syncope. The fixed outflow obstruction cannot compensate for the preload reduction.", S['box_bodyB']), Spacer(1, 1*mm), Paragraph("<b>Q5:</b> Murmur in elderly patient — what features suggest SEVERE (not mild) AS?", S['box_body']), Paragraph("<b>A:</b> LATE-peaking murmur, single/absent A2, slow-rising pulse, narrow pulse pressure, S4 gallop, ECG LV strain. (Note: murmur loudness is NOT reliable.)", S['box_bodyB'])], LIGHT_GOLD, GOLD, S) story.extend(exam_q) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # DRUG TRAPS TABLE # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("DRUG TRAPS TABLE", RED, S)) story.append(Spacer(1, 1*mm)) dt_header = ["Drug/Class", "Trap", "Explanation", "What to Do Instead"] dt_rows = [ ["GTN / Nitrates", "CONTRAINDICATED in severe AS", "Venodilation → ↓preload → ↓CO → severe hypotension/syncope with fixed obstruction", "Opioids for pain (carefully); refer for AVR"], ["ACE inhibitors / ARBs (in severe AS)", "AVOID or use extreme caution", "Arteriolar dilation → ↓afterload → hypotension; the fixed obstruction prevents compensatory increase in CO", "Treat HTN with beta-blockers (cautiously) if needed"], ["Dihydropyridine CCBs (e.g. amlodipine)", "AVOID in severe AS", "Vasodilation → hypotension; negative inotropic CCBs (verapamil, diltiazem) worsen LV function in decompensated AS", "Use with caution if needed for HTN"], ["Statins (for AS progression)", "NOT INDICATED for slowing AS", "SEAS trial (2008) and SALTIRE trial: statins do NOT slow aortic valve calcification or AS progression", "Use statins only for primary/secondary ASCVD prevention"], ["Digoxin in AS + AF", "CAUTION", "Rate control is important; however, avoid if severe LV dysfunction or WPW pathway", "Bisoprolol preferred for rate control; digoxin as adjunct"], ["Anticoagulation (warfarin) post-TAVI", "NOT routinely recommended", "Warfarin does NOT reduce leaflet thrombosis risk more than DAPT in most TAVI patients (GALILEO trial: rivaroxaban increased events)", "Aspirin + clopidogrel x 3–6 months, then aspirin alone"], ["Balloon aortic valvuloplasty as definitive Rx", "TRAP: BAV is NOT curative in adults", "80% restenosis within 1 year in adults with calcific AS. Use as bridge only (to TAVI/SAVR) or for palliation", "Proceed to TAVI or SAVR"], ] story.append(simple_table(dt_header, dt_rows, [35*mm, 40*mm, 65*mm, 35*mm], S, header_bg=RED)) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # NOTABLE TRIALS TABLE # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("NOTABLE TRIALS", DARK_BLUE, S)) story.append(Spacer(1, 1*mm)) trial_header = ["Trial", "Year", "Population", "Key Finding", "Impact"] trial_rows = [ ["PARTNER 1A", "2011", "Severe AS, high surgical risk", "TAVI vs SAVR: similar 1-yr mortality (26.8% vs 24.5%)", "Established TAVI for high-risk patients"], ["PARTNER 2", "2016", "Intermediate risk", "TAVI non-inferior to SAVR at 2 years (HR 0.89)", "Extended TAVI to intermediate-risk"], ["PARTNER 3 (BEV)", "2019", "Low surgical risk", "TAVI significantly lower composite death/stroke/rehospitalisation at 1 yr (8.5% vs 15.1%)", "GAME-CHANGER: TAVI now extends to low-risk"], ["Evolut Low Risk (SEV)", "2019", "Low surgical risk", "Self-expanding TAVI non-inferior to SAVR for death/disabling stroke at 2 yrs", "Second low-risk trial confirming TAVI benefit"], ["NOTION", "2024 (10-yr data)", "All-risk (mostly low)", "Similar all-cause mortality, stroke, MI at 10 years (TAVI vs SAVR)", "TAVI durability validated at 10 years"], ["DEDICATE-DZHK6 (NEJM 2024)", "2024", "Low/intermediate risk; mean age 74", "TAVI non-inferior to SAVR for death/stroke at 1 yr (5.4% vs 10.0%); P<0.001 for NI", "Real-world validation; TAVI may be preferred for most patients"], ["RHEIA trial", "2025", "Women only, all risk", "TAVI superior to SAVR in women for primary composite endpoint", "Suggests TAVI may particularly benefit women"], ["TCW trial (Lancet 2025)", "2025", "AS + complex/multivessel CAD", "TAVI+PCI non-inferior to SAVR+CABG for complex CAD + AS", "Extends TAVI eligibility to complex CAD patients"], ["SEAS (Statin)", "2008", "Mild-moderate AS", "Simvastatin+ezetimibe: no reduction in AS progression", "Confirmed statins do NOT slow AS calcification"], ["AVATAR RCT", "2022", "Asymptomatic severe AS", "Early surgery vs conservative care: early surgery ↓ composite events", "Supports earlier intervention in asymptomatic patients"], ] story.append(simple_table(trial_header, trial_rows, [28*mm, 14*mm, 38*mm, 60*mm, 35*mm], S)) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # MASTER MNEMONICS TABLE # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("MASTER MNEMONICS TABLE", PURPLE, S)) story.append(Spacer(1, 1*mm)) mn_header = ["Mnemonic", "Stands For", "Topic"] mn_rows = [ ["SAD", "Syncope, Angina, Dyspnoea", "Cardinal symptoms of AS"], ["B-C-R-R", "Bicuspid, Calcific, Rheumatic, Rare", "Causes of AS"], ["OLD DASH", "Old age, LDL, Diabetes, Dialysis, Arterial HTN, Smoking, Heavy male sex", "Risk factors for calcific AS"], ["SPEAK", "Slow pulse, Pulse pressure narrow, Ejection systolic murmur, A2 absent, Keep checking for S4", "Physical signs of AS"], ["B-E-C-A-C", "Bedside, Echo, CT calcium, Angiography, Catheterisation", "Investigation sequence"], ["CHEF", "Cardiac failure, Heart block/Conduction, Heyde's, Embolism, Failure of repair (IE/prosthetic)", "Complications of AS"], ["D1-D2-D3", "High-gradient, Low-flow low-gradient low-EF, Low-flow low-gradient normal-EF", "ACC/AHA disease staging for severe symptomatic AS"], ] story.append(simple_table(mn_header, mn_rows, [30*mm, 80*mm, 65*mm], S, header_bg=PURPLE)) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # CROSS-MODULE LINKS # ══════════════════════════════════════════════════════════════════════════════ story.append(section_header("CROSS-MODULE LINKS", TEAL, S)) story.append(Spacer(1, 1*mm)) cross_header = ["AS Links To", "Connection", "HKMLE Relevance"] cross_rows = [ ["Haematology — vWD", "Heyde's syndrome: AS + acquired vWD type 2A → GI bleeding from AVMs", "Ask about GI bleeding in AS patients; AVR cures it"], ["Neurology — Stroke", "Calcium emboli from calcific AS → embolic stroke/TIA; also cardioembolic with AF in AS", "Always image brain after stroke in AS patients"], ["Infectious Disease — IE", "AS is a risk factor for infective endocarditis; BAV especially prone to IE", "Duke's criteria; prophylaxis only if prior IE history"], ["Rheumatology — SLE/RhAr", "SLE (Libman-Sacks) and rheumatoid arthritis: rare valve involvement causing AS", "Ask about systemic autoimmune disease in young AS"], ["Obstetrics — Pregnancy", "Severe AS poorly tolerated in pregnancy; ↑CO of pregnancy → decompensation; intervention before conception if possible", "HKMLE may ask: management of severe AS in pregnancy"], ["Pharmacology — Drug interactions", "Warfarin + bioprosthesis: debate on anticoagulation duration; TAVI + antiplatelet therapy", "GALILEO trial: rivaroxaban post-TAVI HARMFUL"], ["Genetics — BAV", "BAV is the most common CHD (autosomal dominant, incomplete penetrance); screen family members; NOTCH1, ROBO4 mutations", "Family screening when BAV is diagnosed"], ["Renal — CKD", "CKD accelerates calcific AS (hyperphosphataemia, Ca-PO4 product); post-AVR AKI risk", "Monitor renal function closely; calculate contrast load for CT/angio"], ] story.append(simple_table(cross_header, cross_rows, [42*mm, 68*mm, 65*mm], S, header_bg=TEAL)) story.append(Spacer(1, 2*mm)) # ══════════════════════════════════════════════════════════════════════════════ # FOOTER # ══════════════════════════════════════════════════════════════════════════════ story.append(HRFlowable(width='100%', thickness=0.5, color=MED_GREY)) story.append(Spacer(1, 1*mm)) story.append(Paragraph("References: Braunwald's Heart Disease (11e) | Harrison's Principles of Internal Medicine (22e) | AHA/ACC 2020/2021 VHD Guidelines | DEDICATE-DZHK6 NEJM 2024 | NOTION 10-yr EHJ 2024 | TCW Lancet 2025 | RHEIA EHJ 2025 | Textbook of Clinical Echocardiography | HA Clinical Management Guidelines. Compiled for HKMLE preparation — not for direct clinical use.", S['footer'])) # ───────────────────────────────────────────────────────────────────────────── doc.build(story) print(f"PDF generated: {OUTPUT}") PYEOF python3 /tmp/workspace/hkmle-as/generate_pdf.py
sed -i 's/story.append(mnemonic_box(/story.append(mnemonic_box(/g' /tmp/workspace/hkmle-as/generate_pdf.py # Fix all mnemonic_box calls to add S as last argument python3 -c " content = open('/tmp/workspace/hkmle-as/generate_pdf.py').read() # Replace all mnemonic_box calls that don't have S as final arg import re # Find all mnemonic_box calls and add S content = re.sub(r'mnemonic_box\(([^)]+)\)\)', lambda m: 'mnemonic_box(' + m.group(1) + ', S))', content) open('/tmp/workspace/hkmle-as/generate_pdf.py', 'w').write(content) print('Fixed') " python3 /tmp/workspace/hkmle-as/generate_pdf.py
python3 -c " content = open('/tmp/workspace/hkmle-as/generate_pdf.py').read() # Find lines with mnemonic_box and print them with line numbers lines = content.split('\n') for i, line in enumerate(lines, 1): if 'mnemonic_box' in line: print(f'{i}: {line}') "
python3 -c " content = open('/tmp/workspace/hkmle-as/generate_pdf.py').read() lines = content.split('\n') # Show context around lines 271-278, 315-322, 493-500 for start, end in [(269, 280), (313, 326), (491, 503)]: for i, line in enumerate(lines[start:end], start+1): print(f'{i}: {line}') print('---') "
python3 -c " content = open('/tmp/workspace/hkmle-as/generate_pdf.py').read() # Fix line 271-275: add S before closing )) old1 = '''story.append(mnemonic_box(\"MNEMONIC — Causes of AS: 'B-C-R-R'\", [\"B – Bicuspid aortic valve (most common overall in surgical series; earlier onset)\", \"C – Calcific/degenerative (most common in >65 yrs)\", \"R – Rheumatic (always check mitral valve too!)\", \"R – Rare causes (congenital unicuspid, SLE, Paget's, homozygous FH)\"]))''' new1 = '''story.append(mnemonic_box(\"MNEMONIC — Causes of AS: 'B-C-R-R'\", [\"B – Bicuspid aortic valve (most common overall in surgical series; earlier onset)\", \"C – Calcific/degenerative (most common in >65 yrs)\", \"R – Rheumatic (always check mitral valve too!)\", \"R – Rare causes (congenital unicuspid, SLE, Paget's, homozygous FH)\"], S))''' old2 = '''story.append(mnemonic_box(\"MNEMONIC — Risk Factors for Calcific AS: 'OLD DASH'\", [\"O – Old age (>65 years)\", \"L – LDL / Dyslipidaemia (especially Lp(a) — strongest lipid predictor)\", \"D – Diabetes mellitus\", \"D – Dialysis / Chronic Kidney Disease (Ca-PO4 dysregulation)\", \"A – Arterial hypertension\", \"S – Smoking\", \"H – Haemodialysis / male sex (male:female ~2:1 for calcific AS)\"]))''' new2 = '''story.append(mnemonic_box(\"MNEMONIC — Risk Factors for Calcific AS: 'OLD DASH'\", [\"O – Old age (>65 years)\", \"L – LDL / Dyslipidaemia (especially Lp(a) — strongest lipid predictor)\", \"D – Diabetes mellitus\", \"D – Dialysis / Chronic Kidney Disease (Ca-PO4 dysregulation)\", \"A – Arterial hypertension\", \"S – Smoking\", \"H – Haemodialysis / male sex (male:female ~2:1 for calcific AS)\"], S))''' old3 = '''story.append(mnemonic_box(\"MNEMONIC — Complications of AS: 'CHEF'\", [\"C – Cardiac failure (HF — diastolic then systolic; the final common pathway)\", \"C – Conduction defects (LBBB, CHB — especially with calcification extending to conduction system; also post-TAVI/SAVR pacemaker requirement)\", \"H – Haemodyna mic collapse / Sudden cardiac death (2–3% per year in asymptomatic severe AS; up to 15% at 8 yrs if untreated)\", \"E – Embolism (calcium emboli → stroke, TIA, renal/splenic infarcts; Heyde's syndrome: acquired von Willebrand deficiency → GI bleeding from AVMs)\", \"F – Failure of repair (infective endocarditis; prosthetic valve complications: thrombosis, SVD, PPM — Patient-Prosthesis Mismatch)\"]))''' new3 = '''story.append(mnemonic_box(\"MNEMONIC — Complications of AS: 'CHEF'\", [\"C – Cardiac failure (HF — diastolic then systolic; the final common pathway)\", \"C – Conduction defects (LBBB, CHB — especially with calcification extending to conduction system; also post-TAVI/SAVR pacemaker requirement)\", \"H – Haemodynamic collapse / Sudden cardiac death (2-3% per year in asymptomatic severe AS; up to 15% at 8 yrs if untreated)\", \"E – Embolism (calcium emboli, stroke, TIA, renal/splenic infarcts; Heyde's syndrome: acquired von Willebrand deficiency, GI bleeding from AVMs)\", \"F – Failure of repair (infective endocarditis; prosthetic valve complications: thrombosis, SVD, PPM — Patient-Prosthesis Mismatch)\"], S))''' content = content.replace(old1, new1).replace(old2, new2).replace(old3, new3) open('/tmp/workspace/hkmle-as/generate_pdf.py', 'w').write(content) print('Done') " python3 /tmp/workspace/hkmle-as/generate_pdf.py
HKMLE Aortic Stenosis
PDF Document · PDF
| Table | Key Content |
|---|---|
| ⚠️ Drug Traps | GTN, ACEi/ARB, CCBs, statins, warfarin post-TAVI, BAV as definitive Rx |
| 📊 Notable Trials | PARTNER 1A/2/3, Evolut Low Risk, NOTION (10-yr), DEDICATE-DZHK6 2024, RHEIA 2025, TCW 2025, SEAS, AVATAR |
| 🧠 Master Mnemonics | All 7 mnemonics in one reference table |
| 🔗 Cross-Module Links | Haematology (Heyde's), Neurology (stroke), ID (IE), Rheumatology, Obstetrics, Pharmacology, Genetics, Renal |