feat(hypothèque): moteur de taux hypothécaires canadien natif — 12 connecteurs bancaires (RBC, TD, BMO, CIBC, Scotia, BNC, Desjardins, Tangerine, EQ, First National, MCAP, BdC), historisation par périodes de validité, validation anti-aberration, API /api/mortgage/* (best/history/providers/calculate/affordability), calculateur norme canadienne (composition semestrielle, SCHL+TVQ, stress test), section « Financer cette propriété » sur les fiches vente, page /taux-hypothecaires (SEO+sitemap), 61 tests unitaires sur fixtures
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
46 changed files +19,906 −2
added
.env.example
+27 −0
@@ -0,0 +1,27 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — variables d'environnement (modèle ; copier vers .env, NE PAS COMMITTER .env) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# ----------------------------------------------------------------------------- | |
| 5 | + | |
| 6 | +# --- Général ------------------------------------------------------------------ | |
| 7 | +IMMOKA_BASE_URL=https://www.immo-ka.com | |
| 8 | + | |
| 9 | +# --- Connecteurs immobiliers (scraping) ---------------------------------------- | |
| 10 | +FIRECRAWL_API_KEY= | |
| 11 | +SCRAPFLY_KEY= # anti-bot — aussi utilisé par les providers de taux (dernier recours) | |
| 12 | +HQ_CAPTCHA_KEY= | |
| 13 | +HQ_CAPTCHA_PROVIDER= | |
| 14 | + | |
| 15 | +# --- Compte KA (SSO groupe-ka.com) --------------------------------------------- | |
| 16 | +KA_SSO_SECRET= | |
| 17 | +KA_HUB_URL= | |
| 18 | +AUTH_SECRET= | |
| 19 | + | |
| 20 | +# --- Vrai-Prix ----------------------------------------------------------------- | |
| 21 | +VRAIPRIX_DB= | |
| 22 | + | |
| 23 | +# --- Moteur hypothécaire (immoka/mortgage) --------------------------------------- | |
| 24 | +# Aucun taux n'est jamais inventé : ces variables ne règlent que la collecte. | |
| 25 | +IMMOKA_MORTGAGE_INTERVAL_MIN=180 # fréquence de collecte (minutes) — watch/maybe_run | |
| 26 | +IMMOKA_MORTGAGE_RETRIES=3 # tentatives par provider avant échec | |
| 27 | +IMMOKA_MORTGAGE_BACKOFF=5 # backoff exponentiel de base (secondes) | |
modified
.gitignore
+1 −0
@@ -19,3 +19,4 @@ data/transit.db | ||
| 19 | 19 | data/commerces.db |
| 20 | 20 | data/hydro.db |
| 21 | 21 | data/rdl.db |
| 22 | +data/mortgage.db | |
added
docs/mortgage-engine.md
+163 −0
@@ -0,0 +1,163 @@ | ||
| 1 | +# Moteur hypothécaire Immo-Ka (Mortgage Intelligence Engine) | |
| 2 | + | |
| 3 | +Moteur natif de collecte, d'historisation et de calcul des taux hypothécaires | |
| 4 | +canadiens, intégré au backend FastAPI d'Immo-Ka. **Aucun taux n'est jamais | |
| 5 | +inventé, codé en dur ni estimé** : tout taux affiché provient d'une page | |
| 6 | +officielle d'une institution financière, avec provenance (URL source) et | |
| 7 | +fraîcheur (horodatage de collecte). | |
| 8 | + | |
| 9 | +## Architecture | |
| 10 | + | |
| 11 | +``` | |
| 12 | +immoka/mortgage/ | |
| 13 | +├── providers/ # 1 connecteur indépendant par institution (12) | |
| 14 | +│ ├── base.py # RateProvider : fetch() → produits normalisés | |
| 15 | +│ └── README.md # comment ajouter une banque | |
| 16 | +├── validate.py # garde-fous anti-aberration (419 % ≠ 4,19 %…) | |
| 17 | +├── store.py # SQLite annexe data/mortgage.db — historisation | |
| 18 | +├── scheduler.py # orchestration : retries, backoff, santé, isolation | |
| 19 | +├── calc.py # mathématiques hypothécaires canadiennes | |
| 20 | +├── cmhc.py # assurance prêt (SCHL) + taxe de vente QC | |
| 21 | +└── api.py # routes /api/mortgage/* (montées dans web.py) | |
| 22 | +``` | |
| 23 | + | |
| 24 | +Le flux : `provider.fetch()` → `validate_batch()` → `store.record_observations()`. | |
| 25 | +Les providers ne touchent jamais la base ; le calculateur ne touche jamais les | |
| 26 | +scrapers — seule l'API interne les relie. | |
| 27 | + | |
| 28 | +## Institutions couvertes (12 connecteurs) | |
| 29 | + | |
| 30 | +| slug | Institution | Type de source | | |
| 31 | +|---|---|---| | |
| 32 | +| `bank_of_canada` | Banque du Canada | Valet API (JSON officiel) — taux de référence | | |
| 33 | +| `bmo` | BMO | JSON embarqué | | |
| 34 | +| `cibc` | CIBC | JSON | | |
| 35 | +| `desjardins` | Desjardins | HTML | | |
| 36 | +| `eq_bank` | Banque EQ | HTML | | |
| 37 | +| `first_national` | First National | HTML | | |
| 38 | +| `mcap` | MCAP | HTML (taux préférentiel) | | |
| 39 | +| `national_bank` | Banque Nationale | HTML | | |
| 40 | +| `rbc` | RBC | JSON | | |
| 41 | +| `scotiabank` | Banque Scotia | JSON (posted + promos) | | |
| 42 | +| `tangerine` | Tangerine | JSON | | |
| 43 | +| `td` | TD Canada Trust | JSON | | |
| 44 | + | |
| 45 | +Chaque produit est normalisé par `RateProvider.make_product()` : | |
| 46 | +`provider, institution, product_name, rate_type (fixed|variable|other), | |
| 47 | +term_months, kind (posted|special), rate, apr, insured_status | |
| 48 | +(insured|insurable|uninsured|unknown), purpose (purchase|renewal|refinance|unknown), | |
| 49 | +amortization_max_years, conditions, source_url, confidence, raw`. | |
| 50 | + | |
| 51 | +Les taux **préférentiels/prime** sont stockés en `rate_type="other"` + | |
| 52 | +`purpose="unknown"` : ils ne peuvent jamais contaminer un classement | |
| 53 | +« meilleur taux d'achat ». | |
| 54 | + | |
| 55 | +## Validation (validate.py) | |
| 56 | + | |
| 57 | +Rejette avant enregistrement : | |
| 58 | +- taux hors bornes plausibles (0,5 %–24 %) — attrape `4.19 → 419` ; | |
| 59 | +- champs requis manquants, enums invalides, termes hors 3–120 mois ; | |
| 60 | +- APR incohérent (APR < taux − 0,02 pt) ou aberrant ; | |
| 61 | +- doublons exacts dans un même lot (silencieusement dédupliqués). | |
| 62 | + | |
| 63 | +Un lot partiellement invalide n'est pas jeté : les produits sains sont | |
| 64 | +enregistrés, les problèmes journalisés. | |
| 65 | + | |
| 66 | +## Historisation (store.py — data/mortgage.db, WAL) | |
| 67 | + | |
| 68 | +- `rate_observations` : périodes de validité (`valid_from`/`valid_to`, | |
| 69 | + `is_current`). Taux inchangé → simple mise à jour de `last_checked` ; | |
| 70 | + taux changé → clôture de la période + nouvelle ligne. Un saut > 2,5 pts en | |
| 71 | + < 48 h est rejeté **sans écraser** la donnée existante (garde anti-aberration | |
| 72 | + au niveau BD). | |
| 73 | +- `provider_runs` : journal de chaque collecte (statut, durée, produits, | |
| 74 | + changements, rejets) → santé OK / WARNING (> 24 h) / ERROR. | |
| 75 | +- `product_key` : sha1 tronqué de | |
| 76 | + `provider|rate_type|term|kind|insured|purpose|name` — identité stable d'un | |
| 77 | + produit à travers le temps. | |
| 78 | + | |
| 79 | +En cas de panne d'une source, **les derniers taux valides restent servis**, | |
| 80 | +avec leur âge affiché (mention « stale » au-delà de 24 h). | |
| 81 | + | |
| 82 | +## Collecte (scheduler.py) | |
| 83 | + | |
| 84 | +- `run_provider(slug)` : retries (défaut 3) avec backoff exponentiel ; | |
| 85 | + une exception d'un provider n'affecte jamais les autres. | |
| 86 | +- `run()` : séquentiel et poli (`request_delay` par provider — jamais de | |
| 87 | + martèlement des sites bancaires). | |
| 88 | +- `watch(min)` : boucle autonome ; `maybe_run()` est appelé depuis la boucle | |
| 89 | + d'ingestion existante (**process PM2 `immo-ka-sync`**) et ne collecte que si | |
| 90 | + la dernière passe date de plus de `IMMOKA_MORTGAGE_INTERVAL_MIN` minutes | |
| 91 | + (défaut 180). | |
| 92 | + | |
| 93 | +CLI : | |
| 94 | + | |
| 95 | +```bash | |
| 96 | +python run.py mortgage-sync [slug…] # collecte (toutes ou certaines banques) | |
| 97 | +python run.py mortgage-watch [min] # boucle autonome | |
| 98 | +python run.py mortgage-status # santé des providers | |
| 99 | +``` | |
| 100 | + | |
| 101 | +Variables d'environnement (voir `.env.example`) : | |
| 102 | +`IMMOKA_MORTGAGE_INTERVAL_MIN`, `IMMOKA_MORTGAGE_RETRIES`, | |
| 103 | +`IMMOKA_MORTGAGE_BACKOFF`, `SCRAPFLY_KEY` (anti-bot, dernier recours). | |
| 104 | + | |
| 105 | +## Calculateur canadien (calc.py + cmhc.py) | |
| 106 | + | |
| 107 | +- **Composition semestrielle** pour les taux fixes (norme légale canadienne) : | |
| 108 | + taux périodique = `(1 + r/2)^(2/f) − 1`. Valeur étalon vérifiée par test : | |
| 109 | + 100 000 $ à 6 % sur 25 ans = **639,81 $/mois** (≠ 644,30 $ en composition | |
| 110 | + mensuelle américaine — testé aussi, pour prouver qu'on n'utilise pas la | |
| 111 | + mauvaise formule). Taux variables : composition mensuelle. | |
| 112 | +- 6 fréquences : mensuelle, bimensuelle, aux 2 semaines, hebdomadaire, | |
| 113 | + accélérée aux 2 semaines (mensualité ÷ 2), accélérée hebdo (÷ 4). | |
| 114 | +- **Test de résistance** fédéral : qualification à `max(taux + 2, 5,25 %)`. | |
| 115 | +- **SCHL** (cmhc.py) : mise de fonds légale minimale (5 % / 10 % / 20 %), | |
| 116 | + primes par tranche RPV (0,60 % → 4,00 %), surprime +0,20 % amortissement | |
| 117 | + 30 ans (premier acheteur), plafond assurable 1,5 M$, **TVQ 9,975 % sur la | |
| 118 | + prime payable comptant** (spécificité québécoise) — la prime s'ajoute au | |
| 119 | + prêt, la taxe non. | |
| 120 | +- Tableau d'amortissement, résumé de terme (solde au renouvellement), | |
| 121 | + scénarios de renouvellement (+0/+1/+2/+3 pts), ratios ABD/ATD informatifs, | |
| 122 | + inverses (prêt max pour un versement, taux requis). | |
| 123 | + | |
| 124 | +## API interne (`/api/mortgage/*`) | |
| 125 | + | |
| 126 | +| Route | Rôle | | |
| 127 | +|---|---| | |
| 128 | +| `GET /rates` | taux courants filtrables (type, terme, kind, provider…) | | |
| 129 | +| `GET /rates/best` | meilleur taux comparable + classement par institution | | |
| 130 | +| `GET /rates/history` | périodes de validité (historique réel, jamais extrapolé) | | |
| 131 | +| `GET /providers` | santé des sources (OK/WARNING/ERROR, âge, produits) | | |
| 132 | +| `GET /market` | vue marché (meilleur/médiane/variations 7-30 j) | | |
| 133 | +| `GET /intelligence` | market + taux préférentiels (page /taux-hypothecaires) | | |
| 134 | +| `POST /calculate` | calcul complet (SCHL, stress, terme, renouvellement…) | | |
| 135 | +| `POST /affordability` | capacité d'emprunt (ABD/ATD + stress test) | | |
| 136 | + | |
| 137 | +Règle absolue : **jamais de comparaison de produits incomparables** — affiché | |
| 138 | +vs offre spéciale, assuré vs non assuré — sans l'indiquer. Le comparateur ne | |
| 139 | +garde qu'un produit comparable par institution (l'offre spéciale prime). | |
| 140 | + | |
| 141 | +## Frontend | |
| 142 | + | |
| 143 | +- **Fiche propriété** (`Financement.tsx`, section « Financer cette propriété », | |
| 144 | + ventes seulement) : prix prérempli, mise de fonds $/% synchronisée, | |
| 145 | + versement + taux utilisé avec provenance/fraîcheur, SCHL détaillée, | |
| 146 | + coût réel mensuel (+ taxes municipales/scolaires de la fiche), stress test, | |
| 147 | + renouvellement, comparateur banques, historique SVG, amortissement. | |
| 148 | +- **Page `/taux-hypothecaires`** (`Taux.tsx`) : vue marché cliquable, | |
| 149 | + comparateur par institution (nature + fraîcheur + source officielle), | |
| 150 | + historique, santé des sources. Référencée (seo.py + sitemap). | |
| 151 | + | |
| 152 | +## Tests | |
| 153 | + | |
| 154 | +```bash | |
| 155 | +PYTHONPATH=. .venv/bin/python -P -m unittest discover -s tests | |
| 156 | +``` | |
| 157 | + | |
| 158 | +61 tests : `test_mortgage_calc.py` (valeurs étalons, fréquences accélérées, | |
| 159 | +inverses, stress), `test_mortgage_cmhc.py` (primes, TVQ, éligibilité), | |
| 160 | +`test_mortgage_validate.py` (anti-aberration), `test_mortgage_store.py` | |
| 161 | +(historisation, garde 2,5 pts, meilleur taux), `test_mortgage_providers.py` | |
| 162 | +(chaque parseur sur fixtures HTML/JSON committées dans | |
| 163 | +`tests/fixtures/mortgage/` — aucun réseau). | |
modified
frontend/src/App.tsx
+6 −0
@@ -18,6 +18,7 @@ import ListingPage from "./pages/Listing"; | ||
| 18 | 18 | import ProfilPage from "./pages/Profil"; |
| 19 | 19 | import SourcesPage from "./pages/Sources"; |
| 20 | 20 | import StatsPage from "./pages/Stats"; |
| 21 | +import TauxPage from "./pages/Taux"; | |
| 21 | 22 | |
| 22 | 23 | function Ticker() { |
| 23 | 24 | const [items, setItems] = useState<string[]>([]); |
@@ -53,6 +54,7 @@ function Ticker() { | ||
| 53 | 54 | const NAV_LINKS = [ |
| 54 | 55 | { to: "/", label: "Propriétés", icon: "home", end: true }, |
| 55 | 56 | { to: "/?view=carte", label: "Carte", icon: "map", end: false, force: true }, |
| 57 | + { to: "/taux-hypothecaires", label: "Taux hypothécaires", icon: "trendup", end: false }, | |
| 56 | 58 | { to: "/stats", label: "Stats", icon: "chart", end: false }, |
| 57 | 59 | { to: "/agences", label: "Agences", icon: "building", end: false }, |
| 58 | 60 | { to: "/contact", label: "Contact", icon: "arrow", end: false }, |
@@ -146,6 +148,9 @@ function Header() { | ||
| 146 | 148 | <NavLink to="/" end className={({ isActive }) => (isActive ? "active" : "")}> |
| 147 | 149 | Propriétés |
| 148 | 150 | </NavLink> |
| 151 | + <NavLink to="/taux-hypothecaires" className={({ isActive }) => (isActive ? "active" : "")}> | |
| 152 | + Taux | |
| 153 | + </NavLink> | |
| 149 | 154 | <NavLink to="/stats" className={({ isActive }) => (isActive ? "active" : "")}> |
| 150 | 155 | Stats |
| 151 | 156 | </NavLink> |
@@ -219,6 +224,7 @@ export default function App() { | ||
| 219 | 224 | sans cette route, tout lien direct/partagé tombait sur la page 404 */} |
| 220 | 225 | <Route path="/propriete/:uid/:slug" element={<ListingPage />} /> |
| 221 | 226 | <Route path="/stats" element={<StatsPage />} /> |
| 227 | + <Route path="/taux-hypothecaires" element={<TauxPage />} /> | |
| 222 | 228 | <Route path="/agences" element={<SourcesPage />} /> |
| 223 | 229 | <Route path="/contact" element={<ContactPage />} /> |
| 224 | 230 | <Route path="/profil" element={<ProfilPage />} /> |
modified
frontend/src/api.ts
+163 −0
@@ -305,6 +305,169 @@ export async function toggleFavorite(on: boolean, item: FavItem) { | ||
| 305 | 305 | return (await res.json()) as { ok: boolean; on: boolean }; |
| 306 | 306 | } |
| 307 | 307 | |
| 308 | +// ----------------------------------------------------------------------------- | |
| 309 | +// Taux hypothécaires (immoka/mortgage) — taux réels observés chez les banques | |
| 310 | +// ----------------------------------------------------------------------------- | |
| 311 | +export interface MortgageRate { | |
| 312 | + provider: string; | |
| 313 | + institution: string; | |
| 314 | + product_key: string; | |
| 315 | + product_name: string | null; | |
| 316 | + rate_type: "fixed" | "variable" | "adjustable" | "other"; | |
| 317 | + term_months: number; | |
| 318 | + kind: "posted" | "special"; | |
| 319 | + rate: number; | |
| 320 | + apr: number | null; | |
| 321 | + insured_status: "insured" | "insurable" | "uninsured" | "unknown"; | |
| 322 | + purpose: string; | |
| 323 | + conditions: string | null; | |
| 324 | + source_url: string | null; | |
| 325 | + last_checked: number; | |
| 326 | + age_minutes: number; | |
| 327 | + stale: boolean; | |
| 328 | +} | |
| 329 | + | |
| 330 | +export interface MortgageBest extends MortgageRate { | |
| 331 | + median_rate: number | null; | |
| 332 | + institutions_count: number; | |
| 333 | + per_institution: MortgageRate[]; | |
| 334 | +} | |
| 335 | + | |
| 336 | +export interface MortgageMarket { | |
| 337 | + rate_type: string; | |
| 338 | + term_months: number; | |
| 339 | + best: number; | |
| 340 | + best_provider: string; | |
| 341 | + best_institution: string; | |
| 342 | + best_kind: string; | |
| 343 | + median: number | null; | |
| 344 | + spread: number | null; | |
| 345 | + institutions_count: number; | |
| 346 | + var_7d: number | null; | |
| 347 | + var_30d: number | null; | |
| 348 | + var_90d: number | null; | |
| 349 | + lowest_6m: number | null; | |
| 350 | +} | |
| 351 | + | |
| 352 | +export interface MortgageIntelligence { | |
| 353 | + products: MortgageMarket[]; | |
| 354 | + prime_rates: { institution: string; rate: number; product_name: string; | |
| 355 | + age_minutes: number }[]; | |
| 356 | +} | |
| 357 | + | |
| 358 | +export interface MortgageHistoryRow { | |
| 359 | + provider: string; institution: string; product_name: string | null; | |
| 360 | + kind: string; rate: number; insured_status: string; | |
| 361 | + valid_from: number; valid_to: number | null; last_checked: number; | |
| 362 | + source_url: string | null; | |
| 363 | +} | |
| 364 | + | |
| 365 | +export interface MortgageProviderHealth { | |
| 366 | + provider: string; institution: string; source_url: string | null; | |
| 367 | + level: "OK" | "WARNING" | "ERROR"; status: string | null; | |
| 368 | + age_minutes: number; current_products: number; last_data_at: number | null; | |
| 369 | +} | |
| 370 | + | |
| 371 | +export interface MortgageRateSource { | |
| 372 | + provider: string; institution: string; product_name: string | null; | |
| 373 | + kind: string; rate: number; apr?: number | null; insured_status?: string; | |
| 374 | + source_url: string | null; last_checked?: number; | |
| 375 | + age_minutes: number; stale: boolean; | |
| 376 | +} | |
| 377 | + | |
| 378 | +export interface MortgageInsurance { | |
| 379 | + required: boolean; eligible: boolean; premium: number; premium_rate: number; | |
| 380 | + loan_before: number; total_mortgage: number; qc_tax: number; | |
| 381 | + ltv: number | null; issues: string[]; | |
| 382 | +} | |
| 383 | + | |
| 384 | +export interface MortgageCalc { | |
| 385 | + inputs: { | |
| 386 | + price: number; down_payment: number; down_payment_pct: number; | |
| 387 | + rate: number; rate_type: string; term_months: number; | |
| 388 | + amortization_years: number; frequency: string; compounding: string; | |
| 389 | + }; | |
| 390 | + insurance: MortgageInsurance; | |
| 391 | + principal: number; | |
| 392 | + payment: number; | |
| 393 | + payment_monthly_equivalent: number; | |
| 394 | + qualifying: { rate: number; payment: number; note: string }; | |
| 395 | + term: { | |
| 396 | + payment: number; frequency: string; payments_per_year: number; | |
| 397 | + payments_in_term: number; annual_cost: number; principal_paid: number; | |
| 398 | + interest_paid: number; balance_end_of_term: number; paid_off: boolean; | |
| 399 | + }; | |
| 400 | + stress: { bump: number; rate: number; payment: number }[]; | |
| 401 | + renewal: { | |
| 402 | + balance_at_renewal: number; remaining_amortization_years: number; | |
| 403 | + scenarios: { bump: number; rate: number; payment: number }[]; | |
| 404 | + }; | |
| 405 | + payoff_years: number; | |
| 406 | + rate_source: MortgageRateSource | null; | |
| 407 | + annual: { year: number; payment: number; interest: number; | |
| 408 | + principal: number; balance: number }[]; | |
| 409 | + ratios?: { gds: number | null; tds: number | null; | |
| 410 | + gds_ok: boolean | null; tds_ok: boolean | null }; | |
| 411 | +} | |
| 412 | + | |
| 413 | +export interface MortgageCalcInput { | |
| 414 | + price: number; | |
| 415 | + down_payment?: number; | |
| 416 | + down_payment_pct?: number; | |
| 417 | + amortization_years?: number; | |
| 418 | + term_months?: number; | |
| 419 | + frequency?: string; | |
| 420 | + rate_type?: "fixed" | "variable"; | |
| 421 | + rate?: number; | |
| 422 | + income?: number; | |
| 423 | + property_tax_monthly?: number; | |
| 424 | + heating_monthly?: number; | |
| 425 | + condo_fees_monthly?: number; | |
| 426 | + other_debts_monthly?: number; | |
| 427 | +} | |
| 428 | + | |
| 429 | +async function post<T>(path: string, body: unknown): Promise<T> { | |
| 430 | + const ctrl = new AbortController(); | |
| 431 | + const timer = setTimeout(() => ctrl.abort(), 25000); | |
| 432 | + try { | |
| 433 | + const res = await fetch(path, { | |
| 434 | + method: "POST", | |
| 435 | + headers: { "Content-Type": "application/json" }, | |
| 436 | + body: JSON.stringify(body), | |
| 437 | + signal: ctrl.signal, | |
| 438 | + }); | |
| 439 | + if (!res.ok) throw new Error(`API ${res.status} — ${path}`); | |
| 440 | + return (await res.json()) as T; | |
| 441 | + } finally { | |
| 442 | + clearTimeout(timer); | |
| 443 | + } | |
| 444 | +} | |
| 445 | + | |
| 446 | +export const fetchMortgageIntelligence = () => | |
| 447 | + get<MortgageIntelligence>("/api/mortgage/intelligence"); | |
| 448 | + | |
| 449 | +export const fetchMortgageBest = (rateType: string, termMonths: number) => | |
| 450 | + get<MortgageBest>( | |
| 451 | + `/api/mortgage/rates/best?rate_type=${rateType}&term_months=${termMonths}`); | |
| 452 | + | |
| 453 | +export const fetchMortgageHistory = ( | |
| 454 | + rateType: string, termMonths: number, days = 365, kind?: string, | |
| 455 | +) => | |
| 456 | + get<{ count: number; days: number; history: MortgageHistoryRow[] }>( | |
| 457 | + `/api/mortgage/rates/history?rate_type=${rateType}` + | |
| 458 | + `&term_months=${termMonths}&days=${days}${kind ? `&kind=${kind}` : ""}`); | |
| 459 | + | |
| 460 | +export const fetchMortgageProviders = () => | |
| 461 | + get<{ providers: MortgageProviderHealth[]; registered: string[] }>( | |
| 462 | + "/api/mortgage/providers"); | |
| 463 | + | |
| 464 | +export const calculateMortgage = (input: MortgageCalcInput) => | |
| 465 | + post<MortgageCalc>("/api/mortgage/calculate", input); | |
| 466 | + | |
| 467 | +/** 4.19 -> « 4,19 % » */ | |
| 468 | +export const fmtRate = (r: number | null | undefined): string => | |
| 469 | + r == null ? "—" : `${r.toFixed(2).replace(".", ",")} %`; | |
| 470 | + | |
| 308 | 471 | export interface InondationZone { |
| 309 | 472 | type: string; severite: "eleve" | "modere" | "present"; |
| 310 | 473 | recurrence: string; distance_m: number; date_rapport: string | null; |
added
frontend/src/components/Financement.tsx
+373 −0
@@ -0,0 +1,373 @@ | ||
| 1 | +// ----------------------------------------------------------------------------- | |
| 2 | +// Immo-Ka — Agrégateur de propriétés à vendre (province de Québec) | |
| 3 | +// Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +// components/Financement.tsx : « Financer cette propriété » (fiche) — | |
| 5 | +// calculateur hypothécaire canadien branché sur les taux RÉELS observés | |
| 6 | +// (immoka/mortgage). Composition semestrielle pour les taux fixes, | |
| 7 | +// SCHL montrée séparément, test de résistance, comparateur par banque, | |
| 8 | +// historique du taux. Chaque taux affiche sa provenance et sa fraîcheur. | |
| 9 | +// ----------------------------------------------------------------------------- | |
| 10 | +import { useEffect, useMemo, useRef, useState } from "react"; | |
| 11 | +import { Link } from "react-router-dom"; | |
| 12 | +import { | |
| 13 | + MortgageBest, MortgageCalc, calculateMortgage, fetchMortgageBest, | |
| 14 | + fmtPrice, fmtRate, | |
| 15 | +} from "../api"; | |
| 16 | +import TauxHistorique from "./TauxHistorique"; | |
| 17 | + | |
| 18 | +const FREQS: [string, string][] = [ | |
| 19 | + ["monthly", "Mensuel"], | |
| 20 | + ["semimonthly", "Bimensuel (24/an)"], | |
| 21 | + ["biweekly", "Aux 2 semaines"], | |
| 22 | + ["accelerated-biweekly", "Aux 2 semaines accéléré"], | |
| 23 | + ["weekly", "Hebdomadaire"], | |
| 24 | + ["accelerated-weekly", "Hebdomadaire accéléré"], | |
| 25 | +]; | |
| 26 | +const TERMES: [number, string][] = [ | |
| 27 | + [12, "1 an"], [24, "2 ans"], [36, "3 ans"], [48, "4 ans"], | |
| 28 | + [60, "5 ans"], [84, "7 ans"], [120, "10 ans"], | |
| 29 | +]; | |
| 30 | +const KIND_FR: Record<string, string> = { | |
| 31 | + posted: "taux affiché", special: "offre spéciale", | |
| 32 | +}; | |
| 33 | +const INSURED_FR: Record<string, string> = { | |
| 34 | + insured: "assuré", insurable: "assurable", uninsured: "non assuré", | |
| 35 | + unknown: "", | |
| 36 | +}; | |
| 37 | + | |
| 38 | +const nf = (n: number) => n.toLocaleString("fr-CA", { maximumFractionDigits: 0 }); | |
| 39 | +const money = (n: number | null | undefined) => | |
| 40 | + n == null ? "—" : `${n.toLocaleString("fr-CA", { minimumFractionDigits: 2, maximumFractionDigits: 2 })} $`; | |
| 41 | + | |
| 42 | +/** Fraîcheur lisible d'une observation de taux. */ | |
| 43 | +function freshness(ageMinutes: number): string { | |
| 44 | + if (ageMinutes < 60) return `il y a ${ageMinutes} min`; | |
| 45 | + if (ageMinutes < 48 * 60) return `il y a ${Math.round(ageMinutes / 60)} h`; | |
| 46 | + return `il y a ${Math.round(ageMinutes / 1440)} j`; | |
| 47 | +} | |
| 48 | + | |
| 49 | +export default function Financement({ prix, taxesMensuelles }: | |
| 50 | + { prix: number | null; taxesMensuelles: number | null }) { | |
| 51 | + const [price, setPrice] = useState<number>(prix ?? 0); | |
| 52 | + const [down, setDown] = useState<number>(Math.round((prix ?? 0) * 0.2)); | |
| 53 | + const [amort, setAmort] = useState(25); | |
| 54 | + const [term, setTerm] = useState(60); | |
| 55 | + const [rateType, setRateType] = useState<"fixed" | "variable">("fixed"); | |
| 56 | + const [freq, setFreq] = useState("monthly"); | |
| 57 | + const [res, setRes] = useState<MortgageCalc | null>(null); | |
| 58 | + const [err, setErr] = useState<string | null>(null); | |
| 59 | + const [best, setBest] = useState<MortgageBest | null>(null); | |
| 60 | + const timer = useRef<number>(); | |
| 61 | + | |
| 62 | + const downPct = price > 0 ? (down / price) * 100 : 0; | |
| 63 | + const setDownPct = (pct: number) => | |
| 64 | + setDown(Math.round((price * Math.min(99, Math.max(0, pct))) / 100)); | |
| 65 | + | |
| 66 | + // recalcul débobiné : les taux viennent du moteur, jamais du navigateur | |
| 67 | + useEffect(() => { | |
| 68 | + if (!price || price <= 0 || down < 0 || down >= price) { setRes(null); return; } | |
| 69 | + window.clearTimeout(timer.current); | |
| 70 | + timer.current = window.setTimeout(() => { | |
| 71 | + calculateMortgage({ | |
| 72 | + price, down_payment: down, amortization_years: amort, | |
| 73 | + term_months: term, frequency: freq, rate_type: rateType, | |
| 74 | + }) | |
| 75 | + .then((r) => { setRes(r); setErr(null); }) | |
| 76 | + .catch(() => setErr("Taux momentanément indisponibles — réessayez plus tard.")); | |
| 77 | + }, 350); | |
| 78 | + return () => window.clearTimeout(timer.current); | |
| 79 | + }, [price, down, amort, term, rateType, freq]); | |
| 80 | + | |
| 81 | + // comparateur par banque (mêmes type/terme que le scénario) | |
| 82 | + useEffect(() => { | |
| 83 | + setBest(null); | |
| 84 | + fetchMortgageBest(rateType, term).then(setBest).catch(() => setBest(null)); | |
| 85 | + }, [rateType, term]); | |
| 86 | + | |
| 87 | + const coutReel = useMemo(() => { | |
| 88 | + if (!res) return null; | |
| 89 | + const parts: { k: string; v: number }[] = [ | |
| 90 | + { k: "Versement hypothécaire (équiv. mensuel)", v: res.payment_monthly_equivalent }, | |
| 91 | + ]; | |
| 92 | + if (taxesMensuelles != null && taxesMensuelles > 0) | |
| 93 | + parts.push({ k: "Taxes municipales et scolaires", v: taxesMensuelles }); | |
| 94 | + return { parts, total: parts.reduce((s, p) => s + p.v, 0) }; | |
| 95 | + }, [res, taxesMensuelles]); | |
| 96 | + | |
| 97 | + if (prix == null || prix <= 0) return null; | |
| 98 | + const src = res?.rate_source ?? null; | |
| 99 | + const ins = res?.insurance; | |
| 100 | + | |
| 101 | + return ( | |
| 102 | + <section className="f-bloc f-mtg" id="financement"> | |
| 103 | + <h2>Financer cette propriété</h2> | |
| 104 | + <p className="mtg-intro"> | |
| 105 | + Simulation avec les <b>taux réels publiés par les banques canadiennes</b>, | |
| 106 | + collectés en continu par Immo-Ka — composition semestrielle (norme | |
| 107 | + canadienne) pour les taux fixes.{" "} | |
| 108 | + <Link to="/taux-hypothecaires">Voir tous les taux ↗</Link> | |
| 109 | + </p> | |
| 110 | + | |
| 111 | + <div className="mtg-form"> | |
| 112 | + <label> | |
| 113 | + <span>Prix</span> | |
| 114 | + <input type="number" inputMode="numeric" min={1} value={price || ""} | |
| 115 | + onChange={(e) => setPrice(Number(e.target.value) || 0)} /> | |
| 116 | + </label> | |
| 117 | + <label> | |
| 118 | + <span>Mise de fonds ($)</span> | |
| 119 | + <input type="number" inputMode="numeric" min={0} value={down || ""} | |
| 120 | + onChange={(e) => setDown(Number(e.target.value) || 0)} /> | |
| 121 | + </label> | |
| 122 | + <label> | |
| 123 | + <span>Mise de fonds (%)</span> | |
| 124 | + <input type="number" inputMode="decimal" min={0} max={99} step={1} | |
| 125 | + value={downPct ? Math.round(downPct * 10) / 10 : ""} | |
| 126 | + onChange={(e) => setDownPct(Number(e.target.value) || 0)} /> | |
| 127 | + </label> | |
| 128 | + <label> | |
| 129 | + <span>Amortissement</span> | |
| 130 | + <select value={amort} onChange={(e) => setAmort(Number(e.target.value))}> | |
| 131 | + {[10, 15, 20, 25, 30].map((a) => <option key={a} value={a}>{a} ans</option>)} | |
| 132 | + </select> | |
| 133 | + </label> | |
| 134 | + <label> | |
| 135 | + <span>Terme</span> | |
| 136 | + <select value={term} onChange={(e) => setTerm(Number(e.target.value))}> | |
| 137 | + {TERMES.map(([m, l]) => <option key={m} value={m}>{l}</option>)} | |
| 138 | + </select> | |
| 139 | + </label> | |
| 140 | + <label> | |
| 141 | + <span>Type de taux</span> | |
| 142 | + <select value={rateType} | |
| 143 | + onChange={(e) => setRateType(e.target.value as "fixed" | "variable")}> | |
| 144 | + <option value="fixed">Fixe</option> | |
| 145 | + <option value="variable">Variable</option> | |
| 146 | + </select> | |
| 147 | + </label> | |
| 148 | + <label> | |
| 149 | + <span>Fréquence</span> | |
| 150 | + <select value={freq} onChange={(e) => setFreq(e.target.value)}> | |
| 151 | + {FREQS.map(([v, l]) => <option key={v} value={v}>{l}</option>)} | |
| 152 | + </select> | |
| 153 | + </label> | |
| 154 | + </div> | |
| 155 | + | |
| 156 | + {err && <p className="mtg-err">{err}</p>} | |
| 157 | + | |
| 158 | + {res && ( | |
| 159 | + <> | |
| 160 | + <div className="mtg-resultat"> | |
| 161 | + <div className="mtg-kpi"> | |
| 162 | + <span className="mtg-kpi-k">Versement</span> | |
| 163 | + <span className="mtg-kpi-v">{money(res.payment)}</span> | |
| 164 | + <span className="mtg-kpi-sub"> | |
| 165 | + {FREQS.find(([v]) => v === freq)?.[1].toLowerCase()} | |
| 166 | + {freq !== "monthly" && ` · équiv. ${money(res.payment_monthly_equivalent)}/mois`} | |
| 167 | + </span> | |
| 168 | + </div> | |
| 169 | + <div className="mtg-kpi"> | |
| 170 | + <span className="mtg-kpi-k">Taux utilisé</span> | |
| 171 | + <span className="mtg-kpi-v">{fmtRate(res.inputs.rate)}</span> | |
| 172 | + {src && ( | |
| 173 | + <span className="mtg-kpi-sub"> | |
| 174 | + {src.institution} — {src.product_name}{" "} | |
| 175 | + ({KIND_FR[src.kind] ?? src.kind} | |
| 176 | + {INSURED_FR[src.insured_status ?? "unknown"] | |
| 177 | + ? `, ${INSURED_FR[src.insured_status ?? "unknown"]}` : ""}) | |
| 178 | + </span> | |
| 179 | + )} | |
| 180 | + </div> | |
| 181 | + <div className="mtg-kpi"> | |
| 182 | + <span className="mtg-kpi-k">Hypothèque</span> | |
| 183 | + <span className="mtg-kpi-v">{fmtPrice(res.principal)}</span> | |
| 184 | + <span className="mtg-kpi-sub"> | |
| 185 | + mise de fonds {fmtPrice(res.inputs.down_payment)} ({res.inputs.down_payment_pct.toLocaleString("fr-CA")} %) | |
| 186 | + </span> | |
| 187 | + </div> | |
| 188 | + <div className="mtg-kpi"> | |
| 189 | + <span className="mtg-kpi-k">Test de résistance</span> | |
| 190 | + <span className="mtg-kpi-v">{money(res.qualifying.payment)}</span> | |
| 191 | + <span className="mtg-kpi-sub">qualification à {fmtRate(res.qualifying.rate)}</span> | |
| 192 | + </div> | |
| 193 | + </div> | |
| 194 | + | |
| 195 | + {src && ( | |
| 196 | + <p className="mtg-source fine"> | |
| 197 | + Taux observé chez <b>{src.institution}</b> {freshness(src.age_minutes)} | |
| 198 | + {src.stale && " ⚠ donnée de plus de 24 h"} ·{" "} | |
| 199 | + {src.source_url && ( | |
| 200 | + <a href={src.source_url} target="_blank" rel="noopener noreferrer"> | |
| 201 | + source officielle ↗ | |
| 202 | + </a> | |
| 203 | + )} | |
| 204 | + </p> | |
| 205 | + )} | |
| 206 | + | |
| 207 | + {ins && ins.required && ( | |
| 208 | + <div className={`mtg-schl ${ins.eligible ? "" : "mtg-schl-no"}`}> | |
| 209 | + <b>Assurance prêt hypothécaire (SCHL)</b> | |
| 210 | + {ins.eligible ? ( | |
| 211 | + <ul> | |
| 212 | + <li>Prime : <b>{fmtPrice(ins.premium)}</b> ({ins.premium_rate.toLocaleString("fr-CA")} % du prêt, ajoutée à l'hypothèque)</li> | |
| 213 | + <li>TVQ sur la prime : <b>{money(ins.qc_tax)}</b> — payable comptant à la clôture</li> | |
| 214 | + <li>Rapport prêt-valeur : {ins.ltv?.toLocaleString("fr-CA")} %</li> | |
| 215 | + </ul> | |
| 216 | + ) : null} | |
| 217 | + {ins.issues.map((i, k) => <p className="mtg-issue" key={k}>⚠ {i}</p>)} | |
| 218 | + </div> | |
| 219 | + )} | |
| 220 | + | |
| 221 | + {coutReel && ( | |
| 222 | + <details className="mtg-detail"> | |
| 223 | + <summary>Coût réel mensuel estimé</summary> | |
| 224 | + <div className="dtable"> | |
| 225 | + {coutReel.parts.map((p) => ( | |
| 226 | + <div className="drow" key={p.k}><span>{p.k}</span><b>{money(p.v)}</b></div> | |
| 227 | + ))} | |
| 228 | + <div className="drow mtg-total"><span>Total estimé</span><b>{money(coutReel.total)}</b></div> | |
| 229 | + </div> | |
| 230 | + <p className="fine"> | |
| 231 | + {taxesMensuelles == null && | |
| 232 | + "Taxes non publiées pour cette annonce — versement hypothécaire seulement. "} | |
| 233 | + Chauffage, électricité, assurance habitation et copropriété en sus. | |
| 234 | + </p> | |
| 235 | + </details> | |
| 236 | + )} | |
| 237 | + | |
| 238 | + <details className="mtg-detail"> | |
| 239 | + <summary>Et si les taux montent ? (test de résistance)</summary> | |
| 240 | + <div className="dtable"> | |
| 241 | + {res.stress.map((s) => ( | |
| 242 | + <div className="drow" key={s.bump}> | |
| 243 | + <span>{s.bump === 0 ? "Taux actuel" : `+${s.bump} point${s.bump > 1 ? "s" : ""}`} — {fmtRate(s.rate)}</span> | |
| 244 | + <b>{money(s.payment)}</b> | |
| 245 | + </div> | |
| 246 | + ))} | |
| 247 | + </div> | |
| 248 | + <p className="fine">{res.qualifying.note}</p> | |
| 249 | + </details> | |
| 250 | + | |
| 251 | + <details className="mtg-detail"> | |
| 252 | + <summary>Au renouvellement ({TERMES.find(([m]) => m === term)?.[1]})</summary> | |
| 253 | + <p className="fine"> | |
| 254 | + Solde restant à l'échéance : <b>{fmtPrice(res.renewal.balance_at_renewal)}</b>{" "} | |
| 255 | + (amortissement résiduel {res.renewal.remaining_amortization_years} ans). | |
| 256 | + Intérêts payés pendant le terme : {fmtPrice(res.term.interest_paid)}. | |
| 257 | + </p> | |
| 258 | + <div className="dtable"> | |
| 259 | + {res.renewal.scenarios.map((s) => ( | |
| 260 | + <div className="drow" key={s.bump}> | |
| 261 | + <span>Renouvelé à {fmtRate(s.rate)} ({s.bump >= 0 ? "+" : ""}{s.bump} pt)</span> | |
| 262 | + <b>{money(s.payment)}</b> | |
| 263 | + </div> | |
| 264 | + ))} | |
| 265 | + </div> | |
| 266 | + </details> | |
| 267 | + | |
| 268 | + {best && best.per_institution.length > 1 && ( | |
| 269 | + <details className="mtg-detail"> | |
| 270 | + <summary>Comparer les banques ({best.institutions_count} institutions)</summary> | |
| 271 | + <div className="rooms-wrap"> | |
| 272 | + <table className="rooms mtg-comp"> | |
| 273 | + <thead> | |
| 274 | + <tr><th>Institution</th><th>Taux</th><th>Nature</th><th>Versement</th><th>Fraîcheur</th></tr> | |
| 275 | + </thead> | |
| 276 | + <tbody> | |
| 277 | + {best.per_institution.map((r) => ( | |
| 278 | + <tr key={r.provider}> | |
| 279 | + <td> | |
| 280 | + {r.source_url | |
| 281 | + ? <a href={r.source_url} target="_blank" rel="noopener noreferrer">{r.institution}</a> | |
| 282 | + : r.institution} | |
| 283 | + </td> | |
| 284 | + <td><b>{fmtRate(r.rate)}</b>{r.apr != null ? ` (TAP ${fmtRate(r.apr)})` : ""}</td> | |
| 285 | + <td> | |
| 286 | + {KIND_FR[r.kind]} | |
| 287 | + {INSURED_FR[r.insured_status] ? ` · ${INSURED_FR[r.insured_status]}` : ""} | |
| 288 | + </td> | |
| 289 | + <td>{res.principal > 0 ? money(estimatePayment(res, r.rate)) : "—"}</td> | |
| 290 | + <td className={r.stale ? "mtg-stale" : ""}>{freshness(r.age_minutes)}</td> | |
| 291 | + </tr> | |
| 292 | + ))} | |
| 293 | + </tbody> | |
| 294 | + </table> | |
| 295 | + </div> | |
| 296 | + <p className="fine"> | |
| 297 | + Produits comparables seulement (même type, même terme) — un taux | |
| 298 | + « affiché » et une « offre spéciale » ne sont pas la même chose, | |
| 299 | + d'où la colonne Nature. Versements estimés sur votre scénario. | |
| 300 | + </p> | |
| 301 | + </details> | |
| 302 | + )} | |
| 303 | + | |
| 304 | + <details className="mtg-detail"> | |
| 305 | + <summary>Historique du taux ({rateType === "fixed" ? "fixe" : "variable"} {TERMES.find(([m]) => m === term)?.[1]})</summary> | |
| 306 | + <TauxHistorique rateType={rateType} termMonths={term} /> | |
| 307 | + </details> | |
| 308 | + | |
| 309 | + <details className="mtg-detail"> | |
| 310 | + <summary>Amortissement année par année</summary> | |
| 311 | + <div className="rooms-wrap"> | |
| 312 | + <table className="rooms"> | |
| 313 | + <thead> | |
| 314 | + <tr><th>Année</th><th>Intérêts</th><th>Capital</th><th>Solde</th></tr> | |
| 315 | + </thead> | |
| 316 | + <tbody> | |
| 317 | + {res.annual.map((a) => ( | |
| 318 | + <tr key={a.year}> | |
| 319 | + <td>{a.year}</td> | |
| 320 | + <td>{nf(a.interest)} $</td> | |
| 321 | + <td>{nf(a.principal)} $</td> | |
| 322 | + <td>{nf(a.balance)} $</td> | |
| 323 | + </tr> | |
| 324 | + ))} | |
| 325 | + </tbody> | |
| 326 | + </table> | |
| 327 | + </div> | |
| 328 | + {res.payoff_years < res.inputs.amortization_years && ( | |
| 329 | + <p className="fine"> | |
| 330 | + Avec la fréquence accélérée choisie, le prêt s'éteint en{" "} | |
| 331 | + <b>{res.payoff_years} ans</b> au lieu de {res.inputs.amortization_years}. | |
| 332 | + </p> | |
| 333 | + )} | |
| 334 | + </details> | |
| 335 | + </> | |
| 336 | + )} | |
| 337 | + | |
| 338 | + <p className="fine"> | |
| 339 | + Outil indicatif seulement — ne constitue ni une offre de financement ni | |
| 340 | + une préapprobation. Les taux affichés sont ceux publiés par les | |
| 341 | + institutions (source et fraîcheur indiquées) ; vérifiez auprès de la | |
| 342 | + banque ou d'un courtier hypothécaire. | |
| 343 | + </p> | |
| 344 | + </section> | |
| 345 | + ); | |
| 346 | +} | |
| 347 | + | |
| 348 | +/** Versement estimé au taux d'une autre banque, même scénario (approximation | |
| 349 | + * frontend par règle de trois sur le facteur d'annuité — les chiffres | |
| 350 | + * officiels du scénario viennent toujours du moteur). */ | |
| 351 | +function estimatePayment(res: MortgageCalc, rate: number): number { | |
| 352 | + const { amortization_years, frequency, compounding } = res.inputs; | |
| 353 | + const f = ({ monthly: 12, semimonthly: 24, biweekly: 26, | |
| 354 | + "accelerated-biweekly": 26, weekly: 52, "accelerated-weekly": 52 } as | |
| 355 | + Record<string, number>)[frequency] ?? 12; | |
| 356 | + const per = (pct: number, k: number) => | |
| 357 | + compounding === "monthly" | |
| 358 | + ? Math.pow(1 + pct / 100 / 12, 12 / k) - 1 | |
| 359 | + : Math.pow(1 + pct / 100 / 2, 2 / k) - 1; | |
| 360 | + const pay = (pct: number) => { | |
| 361 | + if (frequency.startsWith("accelerated")) { | |
| 362 | + const m = pay0(pct, 12); | |
| 363 | + return Math.round((m / (frequency === "accelerated-biweekly" ? 2 : 4)) * 100) / 100; | |
| 364 | + } | |
| 365 | + return pay0(pct, f); | |
| 366 | + }; | |
| 367 | + const pay0 = (pct: number, k: number) => { | |
| 368 | + const i = per(pct, k); | |
| 369 | + const n = Math.round(amortization_years * k); | |
| 370 | + return Math.round(((res.principal * i) / (1 - Math.pow(1 + i, -n))) * 100) / 100; | |
| 371 | + }; | |
| 372 | + return pay(rate); | |
| 373 | +} | |
added
frontend/src/components/TauxHistorique.tsx
+101 −0
@@ -0,0 +1,101 @@ | ||
| 1 | +// ----------------------------------------------------------------------------- | |
| 2 | +// Immo-Ka — Agrégateur de propriétés à vendre (province de Québec) | |
| 3 | +// Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +// components/TauxHistorique.tsx : graphique SVG de l'évolution du meilleur | |
| 5 | +// taux observé (périodes de validité valid_from/valid_to reconstruites en | |
| 6 | +// courbe en escalier — un taux reste en vigueur tant qu'il n'a pas changé). | |
| 7 | +// ----------------------------------------------------------------------------- | |
| 8 | +import { useEffect, useMemo, useState } from "react"; | |
| 9 | +import { MortgageHistoryRow, fetchMortgageHistory, fmtRate } from "../api"; | |
| 10 | + | |
| 11 | +/** Meilleur taux (toutes institutions) à chaque instant : pour chaque borne | |
| 12 | + * de période, le min des taux dont la période couvre cet instant. */ | |
| 13 | +function bestCurve(rows: MortgageHistoryRow[], now: number) { | |
| 14 | + const stamps = new Set<number>(); | |
| 15 | + for (const r of rows) { | |
| 16 | + stamps.add(r.valid_from); | |
| 17 | + if (r.valid_to != null) stamps.add(r.valid_to); | |
| 18 | + } | |
| 19 | + stamps.add(now); | |
| 20 | + const ts = [...stamps].sort((a, b) => a - b); | |
| 21 | + const pts: { t: number; rate: number }[] = []; | |
| 22 | + for (const t of ts) { | |
| 23 | + let best: number | null = null; | |
| 24 | + for (const r of rows) { | |
| 25 | + if (r.valid_from <= t && (r.valid_to == null || r.valid_to > t)) | |
| 26 | + best = best == null ? r.rate : Math.min(best, r.rate); | |
| 27 | + } | |
| 28 | + if (best != null) pts.push({ t, rate: best }); | |
| 29 | + } | |
| 30 | + return pts; | |
| 31 | +} | |
| 32 | + | |
| 33 | +export default function TauxHistorique({ rateType, termMonths, days = 365 }: | |
| 34 | + { rateType: string; termMonths: number; days?: number }) { | |
| 35 | + const [rows, setRows] = useState<MortgageHistoryRow[] | null>(null); | |
| 36 | + | |
| 37 | + useEffect(() => { | |
| 38 | + setRows(null); | |
| 39 | + fetchMortgageHistory(rateType, termMonths, days, "special") | |
| 40 | + .then((r) => setRows(r.history)) | |
| 41 | + .catch(() => setRows([])); | |
| 42 | + }, [rateType, termMonths, days]); | |
| 43 | + | |
| 44 | + const now = Math.floor(Date.now() / 1000); | |
| 45 | + const pts = useMemo(() => bestCurve(rows ?? [], now), [rows, now]); | |
| 46 | + | |
| 47 | + if (rows == null) return <div className="fine">Chargement de l'historique…</div>; | |
| 48 | + if (pts.length === 0) | |
| 49 | + return <div className="fine">Aucun historique pour ce produit.</div>; | |
| 50 | + | |
| 51 | + const W = 640, H = 180, PAD = { l: 44, r: 10, t: 10, b: 22 }; | |
| 52 | + const t0 = pts[0].t, t1 = now; | |
| 53 | + const rates = pts.map((p) => p.rate); | |
| 54 | + const rMin = Math.floor(Math.min(...rates) * 10) / 10 - 0.1; | |
| 55 | + const rMax = Math.ceil(Math.max(...rates) * 10) / 10 + 0.1; | |
| 56 | + const x = (t: number) => | |
| 57 | + PAD.l + ((t - t0) / Math.max(1, t1 - t0)) * (W - PAD.l - PAD.r); | |
| 58 | + const y = (r: number) => | |
| 59 | + PAD.t + (1 - (r - rMin) / Math.max(0.01, rMax - rMin)) * (H - PAD.t - PAD.b); | |
| 60 | + | |
| 61 | + // courbe en escalier : le taux tient jusqu'au changement suivant | |
| 62 | + let d = `M ${x(pts[0].t).toFixed(1)} ${y(pts[0].rate).toFixed(1)}`; | |
| 63 | + for (let i = 1; i < pts.length; i++) { | |
| 64 | + d += ` H ${x(pts[i].t).toFixed(1)} V ${y(pts[i].rate).toFixed(1)}`; | |
| 65 | + } | |
| 66 | + d += ` H ${x(t1).toFixed(1)}`; | |
| 67 | + | |
| 68 | + const yTicks: number[] = []; | |
| 69 | + for (let r = Math.ceil(rMin * 4) / 4; r <= rMax + 1e-9; r += 0.25) | |
| 70 | + yTicks.push(Math.round(r * 100) / 100); | |
| 71 | + const fmtD = (t: number) => | |
| 72 | + new Date(t * 1000).toLocaleDateString("fr-CA", { month: "short", day: "numeric" }); | |
| 73 | + const last = pts[pts.length - 1]; | |
| 74 | + | |
| 75 | + return ( | |
| 76 | + <div className="mtg-chart"> | |
| 77 | + <svg viewBox={`0 0 ${W} ${H}`} role="img" | |
| 78 | + aria-label={`Évolution du meilleur taux ${rateType} ${termMonths} mois`}> | |
| 79 | + {yTicks.map((r) => ( | |
| 80 | + <g key={r}> | |
| 81 | + <line x1={PAD.l} x2={W - PAD.r} y1={y(r)} y2={y(r)} className="mtg-grid" /> | |
| 82 | + <text x={PAD.l - 6} y={y(r) + 3} className="mtg-tick" textAnchor="end"> | |
| 83 | + {r.toFixed(2).replace(".", ",")} | |
| 84 | + </text> | |
| 85 | + </g> | |
| 86 | + ))} | |
| 87 | + <text x={x(t0)} y={H - 6} className="mtg-tick">{fmtD(t0)}</text> | |
| 88 | + <text x={W - PAD.r} y={H - 6} className="mtg-tick" textAnchor="end"> | |
| 89 | + aujourd'hui | |
| 90 | + </text> | |
| 91 | + <path d={d} className="mtg-line" /> | |
| 92 | + <circle cx={x(t1)} cy={y(last.rate)} r={3.5} className="mtg-dot" /> | |
| 93 | + </svg> | |
| 94 | + <div className="fine"> | |
| 95 | + Meilleur taux « offre spéciale » observé toutes institutions — | |
| 96 | + actuellement <b>{fmtRate(last.rate)}</b>. L'historique se construit au | |
| 97 | + fil des collectes (aucune donnée n'est extrapolée). | |
| 98 | + </div> | |
| 99 | + </div> | |
| 100 | + ); | |
| 101 | +} | |
modified
frontend/src/pages/Listing.tsx
+19 −0
@@ -13,6 +13,7 @@ import { | ||
| 13 | 13 | } from "../api"; |
| 14 | 14 | |
| 15 | 15 | const PropertyMap = lazy(() => import("../components/PropertyMap")); |
| 16 | +import Financement from "../components/Financement"; | |
| 16 | 17 | import QuartierBlock from "../components/QuartierBlock"; |
| 17 | 18 | import RisqueInondation from "../components/RisqueInondation"; |
| 18 | 19 | import QualiteAir from "../components/QualiteAir"; |
@@ -242,6 +243,16 @@ export default function ListingPage() { | ||
| 242 | 243 | const detEntries = Object.entries(l.details ?? {}) |
| 243 | 244 | .filter(([k, v]) => !DETAIL_HIDDEN.has(k) && (typeof v === "string" || typeof v === "number") && String(v).trim()); |
| 244 | 245 | |
| 246 | + // taxes annuelles publiées (Centris) → mensualisées pour le coût réel | |
| 247 | + const taxesAnnuelles = ["Taxes municipales", "Taxes scolaires"] | |
| 248 | + .map((k) => { | |
| 249 | + const v = l.details?.[k]; | |
| 250 | + const n = parseInt(String(v ?? "").replace(/[^\d]/g, ""), 10); | |
| 251 | + return Number.isFinite(n) && n > 0 && n < 200_000 ? n : 0; | |
| 252 | + }) | |
| 253 | + .reduce((a, b) => a + b, 0); | |
| 254 | + const estVente = l.details?.transaction !== "location"; | |
| 255 | + | |
| 245 | 256 | const hist = (l.price_history ?? []).filter((h) => h.price != null); |
| 246 | 257 | const baisse = hist.length >= 2 && hist[0].price !== hist[1].price |
| 247 | 258 | ? { de: hist[1].price!, a: hist[0].price! } : null; |
@@ -458,6 +469,14 @@ export default function ListingPage() { | ||
| 458 | 469 | </div> |
| 459 | 470 | </div> |
| 460 | 471 | |
| 472 | + {/* financement : taux hypothécaires réels + calculateur canadien */} | |
| 473 | + {estVente && ( | |
| 474 | + <Financement | |
| 475 | + prix={l.price} | |
| 476 | + taxesMensuelles={taxesAnnuelles > 0 ? Math.round(taxesAnnuelles / 12) : null} | |
| 477 | + /> | |
| 478 | + )} | |
| 479 | + | |
| 461 | 480 | {/* quartier : pleine largeur, APRÈS les infos de propriété (ordre mobile correct) */} |
| 462 | 481 | <RisqueInondation lat={l.lat} lng={l.lng} /> |
| 463 | 482 | |
added
frontend/src/pages/Taux.tsx
+192 −0
@@ -0,0 +1,192 @@ | ||
| 1 | +// ----------------------------------------------------------------------------- | |
| 2 | +// Immo-Ka — Agrégateur de propriétés à vendre (province de Québec) | |
| 3 | +// Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +// pages/Taux.tsx : /taux-hypothecaires — Mortgage Intelligence. | |
| 5 | +// Vue marché (meilleur/médian/variations), comparateur par banque avec | |
| 6 | +// nature du taux (affiché vs spécial) et fraîcheur, historique, taux | |
| 7 | +// préférentiels, santé des sources. Aucun taux inventé : tout vient des | |
| 8 | +// pages officielles des institutions, avec provenance. | |
| 9 | +// ----------------------------------------------------------------------------- | |
| 10 | +import { useEffect, useState } from "react"; | |
| 11 | +import { | |
| 12 | + MortgageBest, MortgageIntelligence, MortgageProviderHealth, | |
| 13 | + fetchMortgageBest, fetchMortgageIntelligence, fetchMortgageProviders, | |
| 14 | + fmtRate, | |
| 15 | +} from "../api"; | |
| 16 | +import TauxHistorique from "../components/TauxHistorique"; | |
| 17 | + | |
| 18 | +const TERMES: [number, string][] = [ | |
| 19 | + [12, "1 an"], [24, "2 ans"], [36, "3 ans"], [48, "4 ans"], | |
| 20 | + [60, "5 ans"], [84, "7 ans"], [120, "10 ans"], | |
| 21 | +]; | |
| 22 | +const KIND_FR: Record<string, string> = { posted: "affiché", special: "offre spéciale" }; | |
| 23 | +const INSURED_FR: Record<string, string> = { | |
| 24 | + insured: "assuré", insurable: "assurable", uninsured: "non assuré", unknown: "", | |
| 25 | +}; | |
| 26 | + | |
| 27 | +const termeLabel = (m: number) => TERMES.find(([t]) => t === m)?.[1] ?? `${m} mois`; | |
| 28 | +const freshness = (min: number) => | |
| 29 | + min < 60 ? `il y a ${min} min` : min < 48 * 60 | |
| 30 | + ? `il y a ${Math.round(min / 60)} h` : `il y a ${Math.round(min / 1440)} j`; | |
| 31 | +const varTxt = (v: number | null) => | |
| 32 | + v == null ? "—" : v === 0 ? "stable" | |
| 33 | + : `${v > 0 ? "▲ +" : "▼ "}${v.toFixed(2).replace(".", ",")} pt`; | |
| 34 | + | |
| 35 | +export default function TauxPage() { | |
| 36 | + const [intel, setIntel] = useState<MortgageIntelligence | null>(null); | |
| 37 | + const [rateType, setRateType] = useState<"fixed" | "variable">("fixed"); | |
| 38 | + const [term, setTerm] = useState(60); | |
| 39 | + const [best, setBest] = useState<MortgageBest | null>(null); | |
| 40 | + const [health, setHealth] = useState<MortgageProviderHealth[]>([]); | |
| 41 | + | |
| 42 | + useEffect(() => { | |
| 43 | + document.title = "Taux hypothécaires au Canada — comparateur en direct | Immo-Ka"; | |
| 44 | + fetchMortgageIntelligence().then(setIntel).catch(() => setIntel(null)); | |
| 45 | + fetchMortgageProviders().then((r) => setHealth(r.providers)).catch(() => {}); | |
| 46 | + }, []); | |
| 47 | + | |
| 48 | + useEffect(() => { | |
| 49 | + setBest(null); | |
| 50 | + fetchMortgageBest(rateType, term).then(setBest).catch(() => setBest(null)); | |
| 51 | + }, [rateType, term]); | |
| 52 | + | |
| 53 | + return ( | |
| 54 | + <div className="container taux-page"> | |
| 55 | + <header className="taux-head"> | |
| 56 | + <h1>Taux hypothécaires en direct</h1> | |
| 57 | + <p> | |
| 58 | + Les taux réellement publiés par les grandes institutions canadiennes | |
| 59 | + (banques, Desjardins, prêteurs virtuels et monolines), collectés en | |
| 60 | + continu par Immo-Ka. Chaque taux indique sa <b>nature</b> (affiché ou | |
| 61 | + offre spéciale), sa <b>source officielle</b> et sa <b>fraîcheur</b> — | |
| 62 | + jamais de taux inventé ni périmé sans avertissement. | |
| 63 | + </p> | |
| 64 | + </header> | |
| 65 | + | |
| 66 | + {intel && intel.products.length > 0 && ( | |
| 67 | + <section className="f-bloc"> | |
| 68 | + <h2>Vue d'ensemble du marché</h2> | |
| 69 | + <div className="taux-grid"> | |
| 70 | + {intel.products.map((p) => ( | |
| 71 | + <button | |
| 72 | + key={`${p.rate_type}-${p.term_months}`} | |
| 73 | + className={`taux-card ${p.rate_type === rateType && p.term_months === term ? "on" : ""}`} | |
| 74 | + onClick={() => { setRateType(p.rate_type as "fixed" | "variable"); setTerm(p.term_months); }} | |
| 75 | + > | |
| 76 | + <span className="taux-card-k"> | |
| 77 | + {p.rate_type === "fixed" ? "Fixe" : "Variable"} {termeLabel(p.term_months)} | |
| 78 | + </span> | |
| 79 | + <span className="taux-card-v">{fmtRate(p.best)}</span> | |
| 80 | + <span className="taux-card-sub">{p.best_institution}</span> | |
| 81 | + <span className="taux-card-sub"> | |
| 82 | + médiane {fmtRate(p.median)} · 30 j : {varTxt(p.var_30d)} | |
| 83 | + </span> | |
| 84 | + </button> | |
| 85 | + ))} | |
| 86 | + </div> | |
| 87 | + {intel.prime_rates.length > 0 && ( | |
| 88 | + <p className="fine"> | |
| 89 | + Taux préférentiels :{" "} | |
| 90 | + {intel.prime_rates.map((p, i) => ( | |
| 91 | + <span key={i}> | |
| 92 | + {i > 0 && " · "} | |
| 93 | + {p.institution} <b>{fmtRate(p.rate)}</b> | |
| 94 | + </span> | |
| 95 | + ))} | |
| 96 | + </p> | |
| 97 | + )} | |
| 98 | + </section> | |
| 99 | + )} | |
| 100 | + | |
| 101 | + <section className="f-bloc"> | |
| 102 | + <h2>Comparer les institutions</h2> | |
| 103 | + <div className="taux-filtres"> | |
| 104 | + <label> | |
| 105 | + <span>Type</span> | |
| 106 | + <select value={rateType} | |
| 107 | + onChange={(e) => setRateType(e.target.value as "fixed" | "variable")}> | |
| 108 | + <option value="fixed">Fixe</option> | |
| 109 | + <option value="variable">Variable</option> | |
| 110 | + </select> | |
| 111 | + </label> | |
| 112 | + <label> | |
| 113 | + <span>Terme</span> | |
| 114 | + <select value={term} onChange={(e) => setTerm(Number(e.target.value))}> | |
| 115 | + {TERMES.map(([m, l]) => <option key={m} value={m}>{l}</option>)} | |
| 116 | + </select> | |
| 117 | + </label> | |
| 118 | + </div> | |
| 119 | + | |
| 120 | + {best == null ? ( | |
| 121 | + <p className="fine">Aucun taux courant pour ce produit — essayez un autre terme.</p> | |
| 122 | + ) : ( | |
| 123 | + <> | |
| 124 | + <div className="rooms-wrap"> | |
| 125 | + <table className="rooms mtg-comp"> | |
| 126 | + <thead> | |
| 127 | + <tr><th>Institution</th><th>Produit</th><th>Taux</th><th>Nature</th><th>Fraîcheur</th><th>Source</th></tr> | |
| 128 | + </thead> | |
| 129 | + <tbody> | |
| 130 | + {best.per_institution.map((r, i) => ( | |
| 131 | + <tr key={r.provider} className={i === 0 ? "taux-best" : ""}> | |
| 132 | + <td>{r.institution}{i === 0 && <span className="taux-badge">meilleur</span>}</td> | |
| 133 | + <td>{r.product_name}</td> | |
| 134 | + <td><b>{fmtRate(r.rate)}</b>{r.apr != null ? ` (TAP ${fmtRate(r.apr)})` : ""}</td> | |
| 135 | + <td> | |
| 136 | + {KIND_FR[r.kind] ?? r.kind} | |
| 137 | + {INSURED_FR[r.insured_status] ? ` · ${INSURED_FR[r.insured_status]}` : ""} | |
| 138 | + </td> | |
| 139 | + <td className={r.stale ? "mtg-stale" : ""}>{freshness(r.age_minutes)}</td> | |
| 140 | + <td> | |
| 141 | + {r.source_url && ( | |
| 142 | + <a href={r.source_url} target="_blank" rel="noopener noreferrer">officielle ↗</a> | |
| 143 | + )} | |
| 144 | + </td> | |
| 145 | + </tr> | |
| 146 | + ))} | |
| 147 | + </tbody> | |
| 148 | + </table> | |
| 149 | + </div> | |
| 150 | + <p className="fine"> | |
| 151 | + Un seul produit comparable par institution (l'offre spéciale prime | |
| 152 | + sur le taux affiché). Les produits incomparables — assuré vs non | |
| 153 | + assuré, affiché vs spécial — ne sont jamais mélangés dans un même | |
| 154 | + classement sans l'indiquer. | |
| 155 | + </p> | |
| 156 | + </> | |
| 157 | + )} | |
| 158 | + </section> | |
| 159 | + | |
| 160 | + <section className="f-bloc"> | |
| 161 | + <h2>Évolution — {rateType === "fixed" ? "fixe" : "variable"} {termeLabel(term)}</h2> | |
| 162 | + <TauxHistorique rateType={rateType} termMonths={term} /> | |
| 163 | + </section> | |
| 164 | + | |
| 165 | + {health.length > 0 && ( | |
| 166 | + <section className="f-bloc"> | |
| 167 | + <h2>Fraîcheur des sources</h2> | |
| 168 | + <div className="taux-sante"> | |
| 169 | + {health.map((h) => ( | |
| 170 | + <span key={h.provider} | |
| 171 | + className={`taux-src taux-src-${h.level.toLowerCase()}`} | |
| 172 | + title={`${h.current_products} produit(s) courant(s) — dernière collecte ${freshness(h.age_minutes)}`}> | |
| 173 | + {h.institution} | |
| 174 | + </span> | |
| 175 | + ))} | |
| 176 | + </div> | |
| 177 | + <p className="fine"> | |
| 178 | + Vert : collecte récente réussie · jaune : donnée conservée mais | |
| 179 | + vieillissante · rouge : source en erreur. En cas d'échec d'une | |
| 180 | + collecte, les derniers taux valides restent affichés avec leur date. | |
| 181 | + </p> | |
| 182 | + </section> | |
| 183 | + )} | |
| 184 | + | |
| 185 | + <p className="fine"> | |
| 186 | + Informations indicatives seulement, sans garantie — les conditions | |
| 187 | + réelles dépendent de votre dossier. Immo-Ka n'est ni un prêteur ni un | |
| 188 | + courtier hypothécaire. | |
| 189 | + </p> | |
| 190 | + </div> | |
| 191 | + ); | |
| 192 | +} | |
modified
frontend/src/styles.css
+135 −0
@@ -1072,3 +1072,138 @@ table.rooms tbody tr:hover td { background: var(--accent-soft); } | ||
| 1072 | 1072 | margin-top: 10px; |
| 1073 | 1073 | } |
| 1074 | 1074 | .cta-pdf:hover { background: var(--ink); color: var(--paper); } |
| 1075 | + | |
| 1076 | +/* ================= Financement (fiche) + page Taux hypothécaires ========= */ | |
| 1077 | +.f-mtg .mtg-intro { color: var(--ink-2); font-size: 14px; margin: 4px 0 14px; } | |
| 1078 | +.f-mtg .mtg-intro a { color: var(--lime); font-weight: 600; } | |
| 1079 | + | |
| 1080 | +.mtg-form { | |
| 1081 | + display: grid; gap: 10px; | |
| 1082 | + grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); | |
| 1083 | +} | |
| 1084 | +.mtg-form label { display: flex; flex-direction: column; gap: 3px; min-width: 0; } | |
| 1085 | +.mtg-form label > span { | |
| 1086 | + font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; | |
| 1087 | + text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3); | |
| 1088 | +} | |
| 1089 | +.mtg-form input, .mtg-form select { | |
| 1090 | + border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface); | |
| 1091 | + padding: 9px 10px; font-size: 14.5px; font-family: inherit; color: var(--ink); | |
| 1092 | + min-height: 42px; min-width: 0; | |
| 1093 | +} | |
| 1094 | +.mtg-form input:focus, .mtg-form select:focus { | |
| 1095 | + outline: none; box-shadow: 3px 3px 0 var(--lime); | |
| 1096 | +} | |
| 1097 | + | |
| 1098 | +.mtg-err { color: var(--accent-deep); font-size: 13.5px; margin: 12px 0 0; } | |
| 1099 | + | |
| 1100 | +.mtg-resultat { | |
| 1101 | + display: grid; gap: 10px; margin-top: 16px; | |
| 1102 | + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); | |
| 1103 | +} | |
| 1104 | +.mtg-kpi { | |
| 1105 | + border: 1.5px solid var(--line-strong); border-radius: var(--r-card); | |
| 1106 | + background: var(--surface-2); padding: 12px 14px; | |
| 1107 | + display: flex; flex-direction: column; gap: 2px; min-width: 0; | |
| 1108 | +} | |
| 1109 | +.mtg-kpi-k { | |
| 1110 | + font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; | |
| 1111 | + text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); | |
| 1112 | +} | |
| 1113 | +.mtg-kpi-v { | |
| 1114 | + font-family: var(--font-display); font-weight: 700; font-size: 22px; | |
| 1115 | + letter-spacing: -0.02em; | |
| 1116 | +} | |
| 1117 | +.mtg-kpi-sub { font-size: 12px; color: var(--ink-3); } | |
| 1118 | +.mtg-kpi:first-child { background: var(--ink); border-color: var(--ink); } | |
| 1119 | +.mtg-kpi:first-child .mtg-kpi-v { color: var(--lime); } | |
| 1120 | +.mtg-kpi:first-child .mtg-kpi-k, .mtg-kpi:first-child .mtg-kpi-sub { color: rgba(255,255,255,0.75); } | |
| 1121 | + | |
| 1122 | +.mtg-source { margin-top: 10px; } | |
| 1123 | + | |
| 1124 | +.mtg-schl { | |
| 1125 | + margin-top: 14px; border: 1.5px dashed var(--line-strong); | |
| 1126 | + border-radius: var(--r-card); padding: 12px 14px; font-size: 13.5px; | |
| 1127 | + background: var(--surface); | |
| 1128 | +} | |
| 1129 | +.mtg-schl ul { margin: 8px 0 0; padding-left: 18px; display: grid; gap: 3px; } | |
| 1130 | +.mtg-schl-no { border-color: var(--accent-deep); } | |
| 1131 | +.mtg-issue { margin: 8px 0 0; color: var(--accent-deep); font-size: 13px; } | |
| 1132 | + | |
| 1133 | +.mtg-detail { | |
| 1134 | + margin-top: 10px; border: 1.5px solid var(--line-strong); | |
| 1135 | + border-radius: var(--r-card); background: var(--surface); | |
| 1136 | +} | |
| 1137 | +.mtg-detail > summary { | |
| 1138 | + cursor: pointer; padding: 11px 14px; font-weight: 700; font-size: 14px; | |
| 1139 | + list-style: none; display: flex; align-items: center; gap: 8px; | |
| 1140 | +} | |
| 1141 | +.mtg-detail > summary::before { content: "+"; font-family: var(--font-mono); color: var(--lime); font-weight: 700; } | |
| 1142 | +.mtg-detail[open] > summary::before { content: "−"; } | |
| 1143 | +.mtg-detail > summary::-webkit-details-marker { display: none; } | |
| 1144 | +.mtg-detail > *:not(summary) { margin: 0 14px 12px; } | |
| 1145 | +.mtg-detail .fine { border-top: none; padding-top: 0; } | |
| 1146 | +.mtg-total { border-top: 2px solid var(--ink); } | |
| 1147 | +.mtg-comp td, .mtg-comp th { white-space: nowrap; } | |
| 1148 | +.mtg-stale { color: var(--accent-deep); } | |
| 1149 | + | |
| 1150 | +.mtg-chart svg { width: 100%; height: auto; display: block; } | |
| 1151 | +.mtg-grid { stroke: var(--line); stroke-width: 1; } | |
| 1152 | +.mtg-tick { font-family: var(--font-mono); font-size: 10px; fill: var(--ink-3); } | |
| 1153 | +.mtg-line { fill: none; stroke: var(--lime); stroke-width: 2.5; stroke-linejoin: round; } | |
| 1154 | +.mtg-dot { fill: var(--ink); stroke: var(--lime); stroke-width: 2.5; } | |
| 1155 | + | |
| 1156 | +/* ---- page /taux-hypothecaires ---- */ | |
| 1157 | +.taux-page { padding-bottom: 40px; } | |
| 1158 | +.taux-head { margin: 28px 0 6px; max-width: 760px; } | |
| 1159 | +.taux-head h1 { font-family: var(--font-display); font-size: clamp(28px, 5vw, 40px); letter-spacing: -0.03em; } | |
| 1160 | +.taux-head p { color: var(--ink-2); font-size: 15px; margin: 12px 0 0; } | |
| 1161 | +.taux-page > .f-bloc { margin-top: 22px; } | |
| 1162 | + | |
| 1163 | +.taux-grid { | |
| 1164 | + display: grid; gap: 10px; | |
| 1165 | + grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); | |
| 1166 | +} | |
| 1167 | +.taux-card { | |
| 1168 | + border: 1.5px solid var(--ink); border-radius: var(--r-card); | |
| 1169 | + background: var(--surface); padding: 12px 14px; text-align: left; | |
| 1170 | + cursor: pointer; display: flex; flex-direction: column; gap: 2px; | |
| 1171 | + transition: box-shadow 0.15s ease; font-family: inherit; min-width: 0; | |
| 1172 | +} | |
| 1173 | +.taux-card:hover { box-shadow: 3px 3px 0 var(--lime); } | |
| 1174 | +.taux-card.on { background: var(--ink); color: var(--paper); } | |
| 1175 | +.taux-card.on .taux-card-v { color: var(--lime); } | |
| 1176 | +.taux-card-k { | |
| 1177 | + font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; | |
| 1178 | + text-transform: uppercase; letter-spacing: 0.12em; color: var(--ink-3); | |
| 1179 | +} | |
| 1180 | +.taux-card.on .taux-card-k, .taux-card.on .taux-card-sub { color: rgba(255,255,255,0.7); } | |
| 1181 | +.taux-card-v { font-family: var(--font-display); font-weight: 700; font-size: 24px; } | |
| 1182 | +.taux-card-sub { font-size: 11.5px; color: var(--ink-3); } | |
| 1183 | + | |
| 1184 | +.taux-filtres { display: flex; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; } | |
| 1185 | +.taux-filtres label { display: flex; flex-direction: column; gap: 3px; } | |
| 1186 | +.taux-filtres label > span { | |
| 1187 | + font-family: var(--font-mono); font-size: 9.5px; font-weight: 700; | |
| 1188 | + text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink-3); | |
| 1189 | +} | |
| 1190 | +.taux-filtres select { | |
| 1191 | + border: 1.5px solid var(--ink); border-radius: 9px; background: var(--surface); | |
| 1192 | + padding: 9px 12px; font-size: 14.5px; font-family: inherit; min-height: 42px; | |
| 1193 | +} | |
| 1194 | +.taux-best td { background: var(--lime-soft); } | |
| 1195 | +.taux-badge { | |
| 1196 | + font-family: var(--font-mono); font-size: 9px; font-weight: 700; | |
| 1197 | + text-transform: uppercase; letter-spacing: 0.1em; background: var(--ink); | |
| 1198 | + color: var(--lime); border-radius: 999px; padding: 2px 8px; margin-left: 8px; | |
| 1199 | +} | |
| 1200 | +.taux-sante { display: flex; flex-wrap: wrap; gap: 8px; } | |
| 1201 | +.taux-src { | |
| 1202 | + border: 1.5px solid var(--line-strong); border-radius: 999px; | |
| 1203 | + padding: 6px 12px; font-size: 12.5px; font-weight: 600; | |
| 1204 | + display: inline-flex; align-items: center; gap: 7px; | |
| 1205 | +} | |
| 1206 | +.taux-src::before { content: ""; width: 8px; height: 8px; border-radius: 50%; } | |
| 1207 | +.taux-src-ok::before { background: var(--green, #2f9e44); } | |
| 1208 | +.taux-src-warning::before { background: #e8a000; } | |
| 1209 | +.taux-src-error::before { background: var(--accent-deep); } | |
modified
immoka/ingest.py
+6 −1
@@ -105,10 +105,15 @@ def watch(interval_seconds: int = 3600) -> None: | ||
| 105 | 105 | f"{ia['sans_image_valide']} annonce(s) sans image valide") |
| 106 | 106 | except Exception as exc: |
| 107 | 107 | print(f"[immo-ka] imgaudit: erreur non bloquante: {exc}", file=sys.stderr) |
| 108 | − print(f"[immo-ka] prochaine synchronisation dans {interval_seconds // 60} min") | |
| 109 | 108 | try: # estimation Hydro-Québec des nouvelles annonces (cache persistant, coût borné) |
| 110 | 109 | from . import hydro |
| 111 | 110 | hydro.precompute(limit=100, budget=30) |
| 112 | 111 | except Exception as exc: |
| 113 | 112 | print(f"[immoka] hydro: erreur non bloquante: {exc}", file=sys.stderr) |
| 113 | + try: # taux hypothécaires — collecte espacée (IMMOKA_MORTGAGE_INTERVAL_MIN) | |
| 114 | + from .mortgage import scheduler as mortgage_scheduler | |
| 115 | + mortgage_scheduler.maybe_run() | |
| 116 | + except Exception as exc: | |
| 117 | + print(f"[immo-ka] mortgage: erreur non bloquante: {exc}", file=sys.stderr) | |
| 118 | + print(f"[immo-ka] prochaine synchronisation dans {interval_seconds // 60} min") | |
| 114 | 119 | time.sleep(interval_seconds) |
added
immoka/mortgage/__init__.py
+7 −0
@@ -0,0 +1,7 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/ : moteur hypothécaire canadien — collecte des taux publiés par les | |
| 5 | +# institutions financières, historisation, calculs (composition | |
| 6 | +# semestrielle canadienne, SCHL, stress test, abordabilité). | |
| 7 | +# ----------------------------------------------------------------------------- | |
added
immoka/mortgage/api.py
+373 −0
@@ -0,0 +1,373 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/api.py : routes /api/mortgage/* — taux courants, meilleur taux, | |
| 5 | +# historique, santé des providers, calculateur canadien, abordabilité. | |
| 6 | +# Lecture seule sur mortgage.db (le scheduler écrit) ; cache applicatif | |
| 7 | +# 5 min sur les lectures ; jamais d'internals de scraping exposés (le champ | |
| 8 | +# raw est retiré au niveau du store). | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import time | |
| 13 | + | |
| 14 | +from fastapi import APIRouter, Body, HTTPException, Query | |
| 15 | + | |
| 16 | +from . import calc, cmhc, store | |
| 17 | + | |
| 18 | +router = APIRouter(prefix="/api/mortgage", tags=["mortgage"]) | |
| 19 | + | |
| 20 | +CACHE_TTL_S = 300 | |
| 21 | +_cache: dict[str, tuple[float, object]] = {} | |
| 22 | + | |
| 23 | +RATE_TYPES = {"fixed", "variable", "adjustable", "other"} | |
| 24 | +KINDS = {"posted", "special"} | |
| 25 | +INSURED = {"insured", "insurable", "uninsured", "unknown"} | |
| 26 | + | |
| 27 | + | |
| 28 | +def _cached(key: str, builder): | |
| 29 | + hit = _cache.get(key) | |
| 30 | + now = time.time() | |
| 31 | + if hit and now - hit[0] < CACHE_TTL_S: | |
| 32 | + return hit[1] | |
| 33 | + value = builder() | |
| 34 | + _cache[key] = (now, value) | |
| 35 | + if len(_cache) > 512: # borne mémoire : purge des entrées expirées | |
| 36 | + for k in [k for k, (t, _) in _cache.items() if now - t >= CACHE_TTL_S]: | |
| 37 | + _cache.pop(k, None) | |
| 38 | + return value | |
| 39 | + | |
| 40 | + | |
| 41 | +def _check(value, allowed: set, label: str): | |
| 42 | + if value is not None and value not in allowed: | |
| 43 | + raise HTTPException(422, f"{label} invalide : {value}") | |
| 44 | + return value | |
| 45 | + | |
| 46 | + | |
| 47 | +@router.get("/rates") | |
| 48 | +def rates(rate_type: str | None = None, term_months: int | None = None, | |
| 49 | + kind: str | None = None, insured_status: str | None = None, | |
| 50 | + purpose: str | None = Query("purchase"), | |
| 51 | + provider: str | None = None): | |
| 52 | + """Taux courants (dernière donnée valide par produit), filtrables.""" | |
| 53 | + _check(rate_type, RATE_TYPES, "rate_type") | |
| 54 | + _check(kind, KINDS, "kind") | |
| 55 | + _check(insured_status, INSURED, "insured_status") | |
| 56 | + if purpose in ("", "all"): | |
| 57 | + purpose = None | |
| 58 | + key = f"rates|{rate_type}|{term_months}|{kind}|{insured_status}|{purpose}|{provider}" | |
| 59 | + | |
| 60 | + def build(): | |
| 61 | + con = store.connect() | |
| 62 | + rows = store.current_rates( | |
| 63 | + con, rate_type=rate_type, term_months=term_months, kind=kind, | |
| 64 | + insured_status=insured_status, purpose=purpose, provider=provider) | |
| 65 | + con.close() | |
| 66 | + return {"count": len(rows), "rates": rows, | |
| 67 | + "stale_hours_threshold": store.STALE_H} | |
| 68 | + return _cached(key, build) | |
| 69 | + | |
| 70 | + | |
| 71 | +@router.get("/rates/best") | |
| 72 | +def rates_best(rate_type: str = "fixed", term_months: int = 60, | |
| 73 | + insured_status: str | None = None, purpose: str = "purchase"): | |
| 74 | + """Meilleur taux courant par produit comparable + comparateur par banque.""" | |
| 75 | + _check(rate_type, RATE_TYPES, "rate_type") | |
| 76 | + _check(insured_status, INSURED, "insured_status") | |
| 77 | + key = f"best|{rate_type}|{term_months}|{insured_status}|{purpose}" | |
| 78 | + | |
| 79 | + def build(): | |
| 80 | + con = store.connect() | |
| 81 | + best = store.best_rate(con, rate_type=rate_type, | |
| 82 | + term_months=term_months, | |
| 83 | + insured_status=insured_status, purpose=purpose) | |
| 84 | + con.close() | |
| 85 | + if best is None: | |
| 86 | + raise HTTPException(404, "Aucun taux courant pour ces critères") | |
| 87 | + return best | |
| 88 | + return _cached(key, build) | |
| 89 | + | |
| 90 | + | |
| 91 | +@router.get("/rates/history") | |
| 92 | +def rates_history(rate_type: str = "fixed", term_months: int = 60, | |
| 93 | + provider: str | None = None, kind: str | None = None, | |
| 94 | + days: int = 365): | |
| 95 | + """Périodes de validité par produit — reconstruit « le taux X à date ». """ | |
| 96 | + _check(rate_type, RATE_TYPES, "rate_type") | |
| 97 | + _check(kind, KINDS, "kind") | |
| 98 | + days = max(1, min(days, 730)) | |
| 99 | + key = f"hist|{rate_type}|{term_months}|{provider}|{kind}|{days}" | |
| 100 | + | |
| 101 | + def build(): | |
| 102 | + con = store.connect() | |
| 103 | + rows = store.history(con, rate_type, term_months, | |
| 104 | + provider=provider, kind=kind, days=days) | |
| 105 | + con.close() | |
| 106 | + return {"count": len(rows), "days": days, "history": rows} | |
| 107 | + return _cached(key, build) | |
| 108 | + | |
| 109 | + | |
| 110 | +@router.get("/providers") | |
| 111 | +def providers(): | |
| 112 | + """Santé des connecteurs de taux (OK / WARNING / ERROR + fraîcheur).""" | |
| 113 | + def build(): | |
| 114 | + from .providers import PROVIDERS | |
| 115 | + con = store.connect() | |
| 116 | + health = store.provider_health(con) | |
| 117 | + con.close() | |
| 118 | + names = {slug: cls.institution for slug, cls in PROVIDERS.items()} | |
| 119 | + urls = {slug: cls.source_url for slug, cls in PROVIDERS.items()} | |
| 120 | + out = [] | |
| 121 | + for h in health: | |
| 122 | + out.append({ | |
| 123 | + "provider": h["provider"], | |
| 124 | + "institution": names.get(h["provider"], h["provider"]), | |
| 125 | + "source_url": urls.get(h["provider"]), | |
| 126 | + "level": h["level"], | |
| 127 | + "status": h["status"], | |
| 128 | + "age_minutes": h["age_minutes"], | |
| 129 | + "current_products": h["current_products"], | |
| 130 | + "last_data_at": h["last_data_at"], | |
| 131 | + }) | |
| 132 | + return {"providers": out, | |
| 133 | + "registered": sorted(names), | |
| 134 | + "stale_hours_threshold": store.STALE_H} | |
| 135 | + return _cached("providers", build) | |
| 136 | + | |
| 137 | + | |
| 138 | +@router.get("/market") | |
| 139 | +def market(rate_type: str = "fixed", term_months: int = 60): | |
| 140 | + """Métriques Mortgage Intelligence pour un produit donné.""" | |
| 141 | + _check(rate_type, RATE_TYPES, "rate_type") | |
| 142 | + | |
| 143 | + def build(): | |
| 144 | + con = store.connect() | |
| 145 | + stats = store.market_stats(con, rate_type=rate_type, | |
| 146 | + term_months=term_months) | |
| 147 | + con.close() | |
| 148 | + if stats is None: | |
| 149 | + raise HTTPException(404, "Aucun taux courant pour ces critères") | |
| 150 | + return stats | |
| 151 | + return _cached(f"market|{rate_type}|{term_months}", build) | |
| 152 | + | |
| 153 | + | |
| 154 | +@router.get("/intelligence") | |
| 155 | +def intelligence(): | |
| 156 | + """Vue d'ensemble du marché : les produits phares en un appel.""" | |
| 157 | + def build(): | |
| 158 | + con = store.connect() | |
| 159 | + combos = [("fixed", 12), ("fixed", 36), ("fixed", 48), | |
| 160 | + ("fixed", 60), ("fixed", 120), ("variable", 60)] | |
| 161 | + grid = [] | |
| 162 | + for rtype, term in combos: | |
| 163 | + s = store.market_stats(con, rate_type=rtype, term_months=term) | |
| 164 | + if s: | |
| 165 | + grid.append(s) | |
| 166 | + prime_rows = store.current_rates(con, rate_type="other") | |
| 167 | + con.close() | |
| 168 | + prime = [{"institution": r["institution"], "rate": r["rate"], | |
| 169 | + "product_name": r["product_name"], | |
| 170 | + "age_minutes": r["age_minutes"]} | |
| 171 | + for r in prime_rows if "préférentiel" in | |
| 172 | + (r["product_name"] or "").lower() or "prime" in | |
| 173 | + (r["product_name"] or "").lower()] | |
| 174 | + return {"products": grid, "prime_rates": prime} | |
| 175 | + return _cached("intelligence", build) | |
| 176 | + | |
| 177 | + | |
| 178 | +# --------------------------------------------------------------------------- | |
| 179 | +# Calculateur | |
| 180 | +# --------------------------------------------------------------------------- | |
| 181 | + | |
| 182 | +def _pick_rate(rate_type: str, term_months: int, | |
| 183 | + insured_status: str | None) -> dict | None: | |
| 184 | + con = store.connect() | |
| 185 | + best = store.best_rate(con, rate_type=rate_type, term_months=term_months, | |
| 186 | + insured_status=insured_status) | |
| 187 | + con.close() | |
| 188 | + return best | |
| 189 | + | |
| 190 | + | |
| 191 | +def _validate_scenario(price: float, down: float, amort: int, term: int, | |
| 192 | + frequency: str) -> None: | |
| 193 | + if price <= 0 or price > 100_000_000: | |
| 194 | + raise HTTPException(422, "Prix invalide") | |
| 195 | + if down < 0 or down >= price: | |
| 196 | + raise HTTPException(422, "Mise de fonds invalide") | |
| 197 | + if amort not in calc.AMORTIZATIONS_YEARS and not (5 <= amort <= 30): | |
| 198 | + raise HTTPException(422, "Amortissement invalide (5–30 ans)") | |
| 199 | + if not 3 <= term <= 120: | |
| 200 | + raise HTTPException(422, "Terme invalide (3–120 mois)") | |
| 201 | + if frequency not in calc.FREQUENCIES: | |
| 202 | + raise HTTPException(422, f"Fréquence invalide : {frequency}") | |
| 203 | + | |
| 204 | + | |
| 205 | +@router.post("/calculate") | |
| 206 | +def calculate(body: dict = Body(...)): | |
| 207 | + """Calcul hypothécaire canadien complet pour un scénario. | |
| 208 | + | |
| 209 | + Entrées : price, down_payment (ou down_payment_pct), amortization_years, | |
| 210 | + term_months, frequency, rate_type, rate (sinon meilleur taux observé), | |
| 211 | + insured_status?, include_schedule?, income?, other_debts_monthly?, | |
| 212 | + property_tax_monthly?, heating_monthly?, condo_fees_monthly?. | |
| 213 | + """ | |
| 214 | + try: | |
| 215 | + price = float(body.get("price") or 0) | |
| 216 | + if body.get("down_payment") is not None: | |
| 217 | + down = float(body["down_payment"]) | |
| 218 | + else: | |
| 219 | + down = price * float(body.get("down_payment_pct") or 20) / 100 | |
| 220 | + amort = int(body.get("amortization_years") or 25) | |
| 221 | + term = int(body.get("term_months") or 60) | |
| 222 | + frequency = str(body.get("frequency") or "monthly") | |
| 223 | + rate_type = str(body.get("rate_type") or "fixed") | |
| 224 | + except (TypeError, ValueError): | |
| 225 | + raise HTTPException(422, "Paramètres numériques invalides") | |
| 226 | + _check(rate_type, {"fixed", "variable"}, "rate_type") | |
| 227 | + _validate_scenario(price, down, amort, term, frequency) | |
| 228 | + | |
| 229 | + quote = cmhc.insurance_quote(price, down, amort) | |
| 230 | + rate_source = None | |
| 231 | + rate = body.get("rate") | |
| 232 | + if rate is None: | |
| 233 | + insured = "insured" if quote["required"] and quote["eligible"] else None | |
| 234 | + best = _pick_rate(rate_type, term, insured) | |
| 235 | + if best is None: | |
| 236 | + raise HTTPException( | |
| 237 | + 503, "Aucun taux courant disponible — réessayez plus tard") | |
| 238 | + rate = best["rate"] | |
| 239 | + rate_source = {k: best[k] for k in | |
| 240 | + ("provider", "institution", "product_name", "kind", | |
| 241 | + "rate", "apr", "insured_status", "source_url", | |
| 242 | + "last_checked", "age_minutes", "stale")} | |
| 243 | + rate = float(rate) | |
| 244 | + if not 0 < rate <= 25: | |
| 245 | + raise HTTPException(422, "Taux invalide") | |
| 246 | + if quote["required"] and not quote["eligible"]: | |
| 247 | + principal = price - down # non assurable : calcul quand même, signalé | |
| 248 | + else: | |
| 249 | + principal = quote["total_mortgage"] if quote["required"] else price - down | |
| 250 | + | |
| 251 | + compounding = "semi-annual" if rate_type == "fixed" else "monthly" | |
| 252 | + pay = calc.payment(principal, rate, amort, frequency, compounding) | |
| 253 | + monthly_eq = calc.payment(principal, rate, amort, "monthly", compounding) | |
| 254 | + q_rate = calc.qualifying_rate(rate) | |
| 255 | + q_pay = calc.payment(principal, q_rate, amort, frequency, compounding) | |
| 256 | + out = { | |
| 257 | + "inputs": {"price": price, "down_payment": round(down, 2), | |
| 258 | + "down_payment_pct": round(down / price * 100, 2), | |
| 259 | + "rate": rate, "rate_type": rate_type, | |
| 260 | + "term_months": term, "amortization_years": amort, | |
| 261 | + "frequency": frequency, "compounding": compounding}, | |
| 262 | + "insurance": quote, | |
| 263 | + "principal": round(principal, 2), | |
| 264 | + "payment": pay, | |
| 265 | + "payment_monthly_equivalent": monthly_eq, | |
| 266 | + "qualifying": {"rate": q_rate, "payment": q_pay, | |
| 267 | + "note": "Test de résistance : max(taux + 2, 5,25 %)"}, | |
| 268 | + "term": calc.term_summary(principal, rate, amort, term, | |
| 269 | + frequency, compounding), | |
| 270 | + "stress": calc.stress_scenarios(principal, rate, amort, | |
| 271 | + frequency, compounding), | |
| 272 | + "renewal": calc.renewal_scenarios(principal, rate, amort, term, | |
| 273 | + frequency, compounding), | |
| 274 | + "payoff_years": calc.payoff_years(principal, rate, amort, | |
| 275 | + frequency, compounding), | |
| 276 | + "rate_source": rate_source, | |
| 277 | + } | |
| 278 | + rows = calc.schedule(principal, rate, amort, frequency, compounding) | |
| 279 | + out["annual"] = calc.annual_rollup(rows, frequency) | |
| 280 | + if body.get("include_schedule"): | |
| 281 | + out["schedule"] = rows | |
| 282 | + income = body.get("income") | |
| 283 | + if income: | |
| 284 | + out["ratios"] = calc.gds_tds( | |
| 285 | + float(income), monthly_eq, | |
| 286 | + float(body.get("property_tax_monthly") or 0), | |
| 287 | + float(body.get("heating_monthly") or 0), | |
| 288 | + float(body.get("condo_fees_monthly") or 0), | |
| 289 | + float(body.get("other_debts_monthly") or 0)) | |
| 290 | + return out | |
| 291 | + | |
| 292 | + | |
| 293 | +@router.post("/affordability") | |
| 294 | +def affordability(body: dict = Body(...)): | |
| 295 | + """Capacité d'achat : prix max selon un versement cible OU selon les | |
| 296 | + revenus (ABD/ATD au taux de qualification) ; taux requis pour un | |
| 297 | + versement cible vs meilleur taux observé.""" | |
| 298 | + try: | |
| 299 | + amort = int(body.get("amortization_years") or 25) | |
| 300 | + term = int(body.get("term_months") or 60) | |
| 301 | + frequency = str(body.get("frequency") or "monthly") | |
| 302 | + rate_type = str(body.get("rate_type") or "fixed") | |
| 303 | + down = float(body.get("down_payment") or 0) | |
| 304 | + except (TypeError, ValueError): | |
| 305 | + raise HTTPException(422, "Paramètres numériques invalides") | |
| 306 | + _check(rate_type, {"fixed", "variable"}, "rate_type") | |
| 307 | + if frequency not in calc.FREQUENCIES: | |
| 308 | + raise HTTPException(422, f"Fréquence invalide : {frequency}") | |
| 309 | + | |
| 310 | + rate = body.get("rate") | |
| 311 | + rate_source = None | |
| 312 | + if rate is None: | |
| 313 | + best = _pick_rate(rate_type, term, None) | |
| 314 | + if best is None: | |
| 315 | + raise HTTPException( | |
| 316 | + 503, "Aucun taux courant disponible — réessayez plus tard") | |
| 317 | + rate = best["rate"] | |
| 318 | + rate_source = {k: best[k] for k in | |
| 319 | + ("provider", "institution", "product_name", "kind", | |
| 320 | + "rate", "source_url", "age_minutes", "stale")} | |
| 321 | + rate = float(rate) | |
| 322 | + if not 0 < rate <= 25: | |
| 323 | + raise HTTPException(422, "Taux invalide") | |
| 324 | + compounding = "semi-annual" if rate_type == "fixed" else "monthly" | |
| 325 | + q_rate = calc.qualifying_rate(rate) | |
| 326 | + out: dict = {"rate": rate, "qualifying_rate": q_rate, | |
| 327 | + "rate_source": rate_source} | |
| 328 | + | |
| 329 | + target = body.get("target_payment_monthly") | |
| 330 | + if target: | |
| 331 | + target = float(target) | |
| 332 | + loan = calc.max_loan(target, rate, amort, "monthly", compounding) | |
| 333 | + loan_q = calc.max_loan(target, q_rate, amort, "monthly", compounding) | |
| 334 | + out["from_payment"] = { | |
| 335 | + "target_payment_monthly": target, | |
| 336 | + "max_loan": loan, "max_price": round(loan + down, 2), | |
| 337 | + "max_loan_stress_tested": loan_q, | |
| 338 | + "max_price_stress_tested": round(loan_q + down, 2), | |
| 339 | + } | |
| 340 | + income = body.get("income") | |
| 341 | + if income: | |
| 342 | + income = float(income) | |
| 343 | + gds_room = income / 12 * 0.39 \ | |
| 344 | + - float(body.get("property_tax_monthly") or 0) \ | |
| 345 | + - float(body.get("heating_monthly") or 0) \ | |
| 346 | + - float(body.get("condo_fees_monthly") or 0) * 0.5 | |
| 347 | + tds_room = income / 12 * 0.44 \ | |
| 348 | + - float(body.get("property_tax_monthly") or 0) \ | |
| 349 | + - float(body.get("heating_monthly") or 0) \ | |
| 350 | + - float(body.get("condo_fees_monthly") or 0) * 0.5 \ | |
| 351 | + - float(body.get("other_debts_monthly") or 0) | |
| 352 | + room = max(0.0, min(gds_room, tds_room)) | |
| 353 | + loan_q = calc.max_loan(room, q_rate, amort, "monthly", compounding) | |
| 354 | + out["from_income"] = { | |
| 355 | + "income": income, "max_payment_monthly": round(room, 2), | |
| 356 | + "max_loan_stress_tested": loan_q, | |
| 357 | + "max_price_estimate": round(loan_q + down, 2), | |
| 358 | + "note": ("Indicatif seulement (ABD 39 % / ATD 44 % au taux de " | |
| 359 | + "qualification) — ne constitue pas une préapprobation."), | |
| 360 | + } | |
| 361 | + principal = body.get("principal") | |
| 362 | + target_rate_payment = body.get("required_rate_for_payment") | |
| 363 | + if principal and target_rate_payment: | |
| 364 | + req = calc.required_rate(float(principal), float(target_rate_payment), | |
| 365 | + amort, "monthly", compounding) | |
| 366 | + out["required_rate"] = { | |
| 367 | + "principal": float(principal), | |
| 368 | + "target_payment_monthly": float(target_rate_payment), | |
| 369 | + "rate": req, | |
| 370 | + "achievable_now": req is not None and req >= rate, | |
| 371 | + "best_observed": rate, | |
| 372 | + } | |
| 373 | + return out | |
added
immoka/mortgage/calc.py
+257 −0
@@ -0,0 +1,257 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/calc.py : mathématiques hypothécaires canadiennes. | |
| 5 | +# Taux fixes : intérêt composé SEMESTRIELLEMENT, non à l'avance (Loi sur | |
| 6 | +# l'intérêt, art. 6) — jamais la formule américaine (composition mensuelle). | |
| 7 | +# Taux variables : composition mensuelle (convention majoritaire des | |
| 8 | +# prêteurs canadiens). | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import math | |
| 13 | + | |
| 14 | +# Fréquences de paiement : nombre de versements par année. | |
| 15 | +FREQUENCIES: dict[str, int] = { | |
| 16 | + "monthly": 12, | |
| 17 | + "semimonthly": 24, | |
| 18 | + "biweekly": 26, | |
| 19 | + "accelerated-biweekly": 26, | |
| 20 | + "weekly": 52, | |
| 21 | + "accelerated-weekly": 52, | |
| 22 | +} | |
| 23 | + | |
| 24 | +# Taux de qualification minimal (test de résistance B-20 / ligne directrice | |
| 25 | +# du BSIF) : max(taux contractuel + 2 points, plancher). | |
| 26 | +STRESS_TEST_FLOOR = 5.25 | |
| 27 | +STRESS_TEST_BUFFER = 2.0 | |
| 28 | + | |
| 29 | +AMORTIZATIONS_YEARS = [10, 15, 20, 25, 30] | |
| 30 | +TERMS_MONTHS = [12, 24, 36, 48, 60, 84, 120] | |
| 31 | + | |
| 32 | + | |
| 33 | +def periodic_rate(annual_pct: float, frequency: str = "monthly", | |
| 34 | + compounding: str = "semi-annual") -> float: | |
| 35 | + """Taux périodique équivalent au taux nominal annuel `annual_pct` (%). | |
| 36 | + | |
| 37 | + compounding="semi-annual" : convention canadienne des prêts fixes — | |
| 38 | + i = (1 + r/2)^(2/f) − 1. "monthly" : prêts variables — i = (1+r/12)^(12/f) − 1. | |
| 39 | + """ | |
| 40 | + if annual_pct < 0: | |
| 41 | + raise ValueError("taux négatif") | |
| 42 | + f = FREQUENCIES[frequency] | |
| 43 | + r = annual_pct / 100.0 | |
| 44 | + if compounding == "monthly": | |
| 45 | + return (1.0 + r / 12.0) ** (12.0 / f) - 1.0 | |
| 46 | + return (1.0 + r / 2.0) ** (2.0 / f) - 1.0 | |
| 47 | + | |
| 48 | + | |
| 49 | +def payment(principal: float, annual_pct: float, amort_years: float, | |
| 50 | + frequency: str = "monthly", | |
| 51 | + compounding: str = "semi-annual") -> float: | |
| 52 | + """Versement périodique (arrondi au cent). | |
| 53 | + | |
| 54 | + Fréquences accélérées : convention canadienne — le versement mensuel | |
| 55 | + divisé par 2 (aux deux semaines) ou par 4 (hebdomadaire), ce qui raccourcit | |
| 56 | + l'amortissement réel. | |
| 57 | + """ | |
| 58 | + if principal <= 0: | |
| 59 | + return 0.0 | |
| 60 | + if frequency in ("accelerated-biweekly", "accelerated-weekly"): | |
| 61 | + m = payment(principal, annual_pct, amort_years, "monthly", compounding) | |
| 62 | + return round(m / (2 if frequency == "accelerated-biweekly" else 4), 2) | |
| 63 | + i = periodic_rate(annual_pct, frequency, compounding) | |
| 64 | + n = round(amort_years * FREQUENCIES[frequency]) | |
| 65 | + if i == 0: | |
| 66 | + return round(principal / n, 2) | |
| 67 | + return round(principal * i / (1.0 - (1.0 + i) ** -n), 2) | |
| 68 | + | |
| 69 | + | |
| 70 | +def schedule(principal: float, annual_pct: float, amort_years: float, | |
| 71 | + frequency: str = "monthly", compounding: str = "semi-annual", | |
| 72 | + pay_amount: float | None = None, | |
| 73 | + max_periods: int | None = None) -> list[dict]: | |
| 74 | + """Tableau d'amortissement complet : [{n, payment, interest, principal, | |
| 75 | + balance}]. Le dernier versement est ajusté au solde exact. Les fréquences | |
| 76 | + accélérées s'éteignent avant l'amortissement contractuel (comportement | |
| 77 | + attendu). `max_periods` borne la simulation (ex. durée du terme).""" | |
| 78 | + if principal <= 0: | |
| 79 | + return [] | |
| 80 | + i = periodic_rate(annual_pct, frequency, compounding) | |
| 81 | + pmt = pay_amount if pay_amount is not None else payment( | |
| 82 | + principal, annual_pct, amort_years, frequency, compounding) | |
| 83 | + if pmt <= 0: | |
| 84 | + return [] | |
| 85 | + hard_cap = round(amort_years * FREQUENCIES[frequency]) + FREQUENCIES[frequency] | |
| 86 | + if frequency.startswith("accelerated"): | |
| 87 | + hard_cap = round(40 * FREQUENCIES[frequency]) # s'éteint plus tôt | |
| 88 | + limit = min(max_periods, hard_cap) if max_periods else hard_cap | |
| 89 | + rows: list[dict] = [] | |
| 90 | + bal = round(principal, 2) | |
| 91 | + n = 0 | |
| 92 | + while bal > 0.005 and n < limit: | |
| 93 | + n += 1 | |
| 94 | + interest = round(bal * i, 2) | |
| 95 | + cap = round(pmt - interest, 2) | |
| 96 | + if cap <= 0 and n > 1: | |
| 97 | + break # paiement insuffisant : ne jamais boucler à l'infini | |
| 98 | + if cap >= bal: # dernier versement ajusté | |
| 99 | + cap = bal | |
| 100 | + row_pay = round(cap + interest, 2) | |
| 101 | + else: | |
| 102 | + row_pay = pmt | |
| 103 | + bal = round(bal - cap, 2) | |
| 104 | + rows.append({"n": n, "payment": row_pay, "interest": interest, | |
| 105 | + "principal": cap, "balance": bal}) | |
| 106 | + return rows | |
| 107 | + | |
| 108 | + | |
| 109 | +def annual_rollup(rows: list[dict], frequency: str = "monthly") -> list[dict]: | |
| 110 | + """Agrège un tableau d'amortissement par année de prêt.""" | |
| 111 | + f = FREQUENCIES[frequency] | |
| 112 | + out: list[dict] = [] | |
| 113 | + for r in rows: | |
| 114 | + year = (r["n"] - 1) // f + 1 | |
| 115 | + if not out or out[-1]["year"] != year: | |
| 116 | + out.append({"year": year, "payment": 0.0, "interest": 0.0, | |
| 117 | + "principal": 0.0, "balance": r["balance"]}) | |
| 118 | + acc = out[-1] | |
| 119 | + acc["payment"] = round(acc["payment"] + r["payment"], 2) | |
| 120 | + acc["interest"] = round(acc["interest"] + r["interest"], 2) | |
| 121 | + acc["principal"] = round(acc["principal"] + r["principal"], 2) | |
| 122 | + acc["balance"] = r["balance"] | |
| 123 | + return out | |
| 124 | + | |
| 125 | + | |
| 126 | +def term_summary(principal: float, annual_pct: float, amort_years: float, | |
| 127 | + term_months: int, frequency: str = "monthly", | |
| 128 | + compounding: str = "semi-annual") -> dict: | |
| 129 | + """Bilan du terme : versement, nombre de versements, capital payé, | |
| 130 | + intérêts payés, solde à l'échéance du terme.""" | |
| 131 | + f = FREQUENCIES[frequency] | |
| 132 | + n_term = round(f * term_months / 12) | |
| 133 | + rows = schedule(principal, annual_pct, amort_years, frequency, | |
| 134 | + compounding, max_periods=n_term) | |
| 135 | + pmt = payment(principal, annual_pct, amort_years, frequency, compounding) | |
| 136 | + interest = round(sum(r["interest"] for r in rows), 2) | |
| 137 | + cap = round(sum(r["principal"] for r in rows), 2) | |
| 138 | + balance = rows[-1]["balance"] if rows else round(principal, 2) | |
| 139 | + payments_per_year = f | |
| 140 | + return { | |
| 141 | + "payment": pmt, | |
| 142 | + "frequency": frequency, | |
| 143 | + "payments_per_year": payments_per_year, | |
| 144 | + "payments_in_term": len(rows), | |
| 145 | + "annual_cost": round(pmt * payments_per_year, 2), | |
| 146 | + "principal_paid": cap, | |
| 147 | + "interest_paid": interest, | |
| 148 | + "balance_end_of_term": balance, | |
| 149 | + "paid_off": balance <= 0.005, | |
| 150 | + } | |
| 151 | + | |
| 152 | + | |
| 153 | +def payoff_years(principal: float, annual_pct: float, amort_years: float, | |
| 154 | + frequency: str, compounding: str = "semi-annual") -> float: | |
| 155 | + """Durée réelle d'extinction (années) — utile pour les fréquences | |
| 156 | + accélérées qui raccourcissent l'amortissement.""" | |
| 157 | + rows = schedule(principal, annual_pct, amort_years, frequency, compounding) | |
| 158 | + if not rows or rows[-1]["balance"] > 0.005: | |
| 159 | + return float(amort_years) | |
| 160 | + return round(len(rows) / FREQUENCIES[frequency], 2) | |
| 161 | + | |
| 162 | + | |
| 163 | +def max_loan(target_payment: float, annual_pct: float, amort_years: float, | |
| 164 | + frequency: str = "monthly", | |
| 165 | + compounding: str = "semi-annual") -> float: | |
| 166 | + """Prêt maximal finançable avec un versement donné (calcul inverse).""" | |
| 167 | + if target_payment <= 0: | |
| 168 | + return 0.0 | |
| 169 | + if frequency in ("accelerated-biweekly", "accelerated-weekly"): | |
| 170 | + # équivalent : versement mensuel = paiement × 2 ou × 4 | |
| 171 | + mult = 2 if frequency == "accelerated-biweekly" else 4 | |
| 172 | + return max_loan(target_payment * mult, annual_pct, amort_years, | |
| 173 | + "monthly", compounding) | |
| 174 | + i = periodic_rate(annual_pct, frequency, compounding) | |
| 175 | + n = round(amort_years * FREQUENCIES[frequency]) | |
| 176 | + if i == 0: | |
| 177 | + return round(target_payment * n, 2) | |
| 178 | + return round(target_payment * (1.0 - (1.0 + i) ** -n) / i, 2) | |
| 179 | + | |
| 180 | + | |
| 181 | +def required_rate(principal: float, target_payment: float, amort_years: float, | |
| 182 | + frequency: str = "monthly", | |
| 183 | + compounding: str = "semi-annual") -> float | None: | |
| 184 | + """Taux annuel (%) tel que le versement du prêt = `target_payment`. | |
| 185 | + Bisection sur [0, 25]. None si même 0 % ne suffit pas.""" | |
| 186 | + if principal <= 0 or target_payment <= 0: | |
| 187 | + return None | |
| 188 | + if payment(principal, 0.0, amort_years, frequency, compounding) > target_payment: | |
| 189 | + return None | |
| 190 | + lo, hi = 0.0, 25.0 | |
| 191 | + if payment(principal, hi, amort_years, frequency, compounding) < target_payment: | |
| 192 | + return hi | |
| 193 | + for _ in range(60): | |
| 194 | + mid = (lo + hi) / 2 | |
| 195 | + if payment(principal, mid, amort_years, frequency, compounding) > target_payment: | |
| 196 | + hi = mid | |
| 197 | + else: | |
| 198 | + lo = mid | |
| 199 | + return round(lo, 2) | |
| 200 | + | |
| 201 | + | |
| 202 | +def qualifying_rate(contract_pct: float) -> float: | |
| 203 | + """Taux de qualification du test de résistance canadien.""" | |
| 204 | + return round(max(contract_pct + STRESS_TEST_BUFFER, STRESS_TEST_FLOOR), 2) | |
| 205 | + | |
| 206 | + | |
| 207 | +def stress_scenarios(principal: float, annual_pct: float, amort_years: float, | |
| 208 | + frequency: str = "monthly", | |
| 209 | + compounding: str = "semi-annual", | |
| 210 | + bumps: tuple = (0.0, 1.0, 2.0, 3.0)) -> list[dict]: | |
| 211 | + """« Et si les taux montent ? » — versement à +0/+1/+2/+3 points.""" | |
| 212 | + return [{ | |
| 213 | + "bump": b, | |
| 214 | + "rate": round(annual_pct + b, 2), | |
| 215 | + "payment": payment(principal, annual_pct + b, amort_years, | |
| 216 | + frequency, compounding), | |
| 217 | + } for b in bumps] | |
| 218 | + | |
| 219 | + | |
| 220 | +def renewal_scenarios(principal: float, annual_pct: float, amort_years: float, | |
| 221 | + term_months: int, frequency: str = "monthly", | |
| 222 | + compounding: str = "semi-annual", | |
| 223 | + bumps: tuple = (-1.0, 0.0, 1.0, 2.0)) -> dict: | |
| 224 | + """Scénario de renouvellement : solde restant à la fin du terme, puis | |
| 225 | + versement recalculé sur l'amortissement résiduel à divers taux.""" | |
| 226 | + summary = term_summary(principal, annual_pct, amort_years, term_months, | |
| 227 | + frequency, compounding) | |
| 228 | + balance = summary["balance_end_of_term"] | |
| 229 | + remaining_years = max(amort_years - term_months / 12.0, 1.0) | |
| 230 | + rows = [] | |
| 231 | + for b in bumps: | |
| 232 | + r = round(annual_pct + b, 2) | |
| 233 | + if r <= 0 or balance <= 0: | |
| 234 | + continue | |
| 235 | + rows.append({"bump": b, "rate": r, | |
| 236 | + "payment": payment(balance, r, remaining_years, | |
| 237 | + frequency, compounding)}) | |
| 238 | + return {"balance_at_renewal": balance, | |
| 239 | + "remaining_amortization_years": round(remaining_years, 1), | |
| 240 | + "scenarios": rows} | |
| 241 | + | |
| 242 | + | |
| 243 | +def gds_tds(gross_annual_income: float, mortgage_payment_monthly: float, | |
| 244 | + property_tax_monthly: float = 0.0, heating_monthly: float = 0.0, | |
| 245 | + condo_fees_monthly: float = 0.0, | |
| 246 | + other_debts_monthly: float = 0.0) -> dict: | |
| 247 | + """Ratios ABD/ATD (GDS/TDS). Convention : 50 % des frais de copropriété. | |
| 248 | + Seuils usuels assurés SCHL : ABD ≤ 39 %, ATD ≤ 44 %. Informatif seulement.""" | |
| 249 | + if gross_annual_income <= 0: | |
| 250 | + return {"gds": None, "tds": None, "gds_ok": None, "tds_ok": None} | |
| 251 | + monthly_income = gross_annual_income / 12.0 | |
| 252 | + housing = (mortgage_payment_monthly + property_tax_monthly + | |
| 253 | + heating_monthly + 0.5 * condo_fees_monthly) | |
| 254 | + gds = round(100.0 * housing / monthly_income, 1) | |
| 255 | + tds = round(100.0 * (housing + other_debts_monthly) / monthly_income, 1) | |
| 256 | + return {"gds": gds, "tds": tds, "gds_ok": gds <= 39.0, "tds_ok": tds <= 44.0, | |
| 257 | + "gds_limit": 39.0, "tds_limit": 44.0} | |
added
immoka/mortgage/cmhc.py
+123 −0
@@ -0,0 +1,123 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/cmhc.py : assurance prêt hypothécaire (SCHL / Sagen / Canada | |
| 5 | +# Guaranty). Règles et barèmes isolés ici pour être mis à jour facilement. | |
| 6 | +# Barème standard en vigueur (2026) — primes en % du prêt selon le | |
| 7 | +# rapport prêt-valeur (RPV). | |
| 8 | +# ----------------------------------------------------------------------------- | |
| 9 | +from __future__ import annotations | |
| 10 | + | |
| 11 | +# (RPV maximal, prime en % du prêt) | |
| 12 | +PREMIUM_TABLE: list[tuple[float, float]] = [ | |
| 13 | + (0.65, 0.0060), | |
| 14 | + (0.75, 0.0170), | |
| 15 | + (0.80, 0.0240), | |
| 16 | + (0.85, 0.0280), | |
| 17 | + (0.90, 0.0310), | |
| 18 | + (0.95, 0.0400), | |
| 19 | +] | |
| 20 | + | |
| 21 | +# Surprime pour amortissement assuré de 30 ans (premier acheteur / neuf, | |
| 22 | +# admissible depuis déc. 2024). | |
| 23 | +SURCHARGE_30Y = 0.0020 | |
| 24 | + | |
| 25 | +# Prix maximal admissible à l'assurance (porté de 1 M$ à 1,5 M$ en déc. 2024). | |
| 26 | +MAX_INSURABLE_PRICE = 1_500_000 | |
| 27 | + | |
| 28 | +# Amortissement maximal assuré (30 ans seulement premier acheteur / neuf). | |
| 29 | +MAX_INSURED_AMORTIZATION = 25 | |
| 30 | +MAX_INSURED_AMORTIZATION_FTHB = 30 | |
| 31 | + | |
| 32 | +# Taxe de vente du Québec sur la prime (payable comptant à la clôture, | |
| 33 | +# jamais ajoutée au prêt). | |
| 34 | +QC_TAX_ON_PREMIUM = 0.09975 | |
| 35 | + | |
| 36 | + | |
| 37 | +def min_down_payment(price: float) -> float: | |
| 38 | + """Mise de fonds minimale légale au Canada. | |
| 39 | + 5 % de la première tranche de 500 000 $, 10 % de l'excédent jusqu'à | |
| 40 | + 1,5 M$ ; 20 % à compter de 1,5 M$.""" | |
| 41 | + if price <= 0: | |
| 42 | + return 0.0 | |
| 43 | + if price >= MAX_INSURABLE_PRICE: | |
| 44 | + return round(0.20 * price, 2) | |
| 45 | + return round(0.05 * min(price, 500_000) + 0.10 * max(0.0, price - 500_000), 2) | |
| 46 | + | |
| 47 | + | |
| 48 | +def premium_rate(ltv: float, amort_years: int = 25) -> float | None: | |
| 49 | + """Taux de prime selon le RPV. None si RPV > 95 % (non assurable).""" | |
| 50 | + if ltv <= 0: | |
| 51 | + return 0.0 | |
| 52 | + for cap, rate in PREMIUM_TABLE: | |
| 53 | + if ltv <= cap + 1e-9: | |
| 54 | + extra = SURCHARGE_30Y if amort_years > 25 else 0.0 | |
| 55 | + return rate + extra | |
| 56 | + return None | |
| 57 | + | |
| 58 | + | |
| 59 | +def insurance_quote(price: float, down_payment: float, | |
| 60 | + amort_years: int = 25) -> dict: | |
| 61 | + """Décomposition complète de l'assurance prêt hypothécaire. | |
| 62 | + | |
| 63 | + Retourne : required (bool), eligible (bool), premium, premium_rate, | |
| 64 | + loan_before, total_mortgage, qc_tax (payable comptant), ltv, issues[]. | |
| 65 | + Ne devine rien : si le scénario est inadmissible, le dit explicitement. | |
| 66 | + """ | |
| 67 | + issues: list[str] = [] | |
| 68 | + if price <= 0 or down_payment < 0 or down_payment >= price: | |
| 69 | + return {"required": False, "eligible": False, "premium": 0.0, | |
| 70 | + "premium_rate": 0.0, "loan_before": max(price - down_payment, 0.0), | |
| 71 | + "total_mortgage": max(price - down_payment, 0.0), | |
| 72 | + "qc_tax": 0.0, "ltv": None, "issues": ["paramètres invalides"]} | |
| 73 | + loan = round(price - down_payment, 2) | |
| 74 | + ltv = loan / price | |
| 75 | + required = ltv > 0.80 + 1e-9 | |
| 76 | + if not required: | |
| 77 | + return {"required": False, "eligible": True, "premium": 0.0, | |
| 78 | + "premium_rate": 0.0, "loan_before": loan, | |
| 79 | + "total_mortgage": loan, "qc_tax": 0.0, | |
| 80 | + "ltv": round(ltv * 100, 2), "issues": issues} | |
| 81 | + # Prêt assuré : vérifier l'admissibilité. | |
| 82 | + eligible = True | |
| 83 | + if price >= MAX_INSURABLE_PRICE: | |
| 84 | + eligible = False | |
| 85 | + issues.append("prix ≥ 1,5 M$ : assurance non disponible — mise de " | |
| 86 | + "fonds de 20 % requise") | |
| 87 | + if down_payment < min_down_payment(price) - 0.01: | |
| 88 | + eligible = False | |
| 89 | + issues.append("mise de fonds sous le minimum légal " | |
| 90 | + f"({min_down_payment(price):,.0f} $)".replace(",", " ")) | |
| 91 | + if amort_years > MAX_INSURED_AMORTIZATION_FTHB: | |
| 92 | + eligible = False | |
| 93 | + issues.append("amortissement > 30 ans impossible pour un prêt assuré") | |
| 94 | + elif amort_years > MAX_INSURED_AMORTIZATION: | |
| 95 | + issues.append("30 ans assuré : réservé premier acheteur ou " | |
| 96 | + "construction neuve (surprime de 0,20 %)") | |
| 97 | + rate = premium_rate(ltv, amort_years) if eligible else None | |
| 98 | + if rate is None and eligible: | |
| 99 | + eligible = False | |
| 100 | + issues.append("rapport prêt-valeur > 95 % : non assurable") | |
| 101 | + premium = round(loan * rate, 2) if (eligible and rate) else 0.0 | |
| 102 | + return { | |
| 103 | + "required": True, | |
| 104 | + "eligible": eligible, | |
| 105 | + "premium": premium, | |
| 106 | + "premium_rate": round((rate or 0.0) * 100, 2), | |
| 107 | + "loan_before": loan, | |
| 108 | + "total_mortgage": round(loan + premium, 2), | |
| 109 | + "qc_tax": round(premium * QC_TAX_ON_PREMIUM, 2), | |
| 110 | + "ltv": round(ltv * 100, 2), | |
| 111 | + "issues": issues, | |
| 112 | + } | |
| 113 | + | |
| 114 | + | |
| 115 | +def allowed_amortizations(price: float, down_payment: float) -> list[int]: | |
| 116 | + """Amortissements permis pour un scénario donné (25 ans max si assuré, | |
| 117 | + 30 ans si mise de fonds ≥ 20 % — ou premier acheteur/neuf assuré).""" | |
| 118 | + if price <= 0: | |
| 119 | + return [10, 15, 20, 25, 30] | |
| 120 | + ltv = (price - down_payment) / price | |
| 121 | + if ltv > 0.80: | |
| 122 | + return [10, 15, 20, 25, 30] # 30 = cas particulier (signalé par issues) | |
| 123 | + return [10, 15, 20, 25, 30] | |
added
immoka/mortgage/providers/README.md
+85 −0
@@ -0,0 +1,85 @@ | ||
| 1 | +# Providers de taux hypothécaires | |
| 2 | + | |
| 3 | +Un connecteur **indépendant** par institution. Auto-découverte : tout module du | |
| 4 | +dossier définissant une sous-classe de `RateProvider` avec un `provider_id` | |
| 5 | +non vide est enregistré dans `PROVIDERS` automatiquement (aucun registre à | |
| 6 | +éditer). La panne d'un provider n'affecte jamais les autres. | |
| 7 | + | |
| 8 | +**Règle absolue : aucun taux inventé.** Un produit non confirmé sur la page | |
| 9 | +officielle est simplement omis — jamais deviné, jamais de valeur par défaut. | |
| 10 | + | |
| 11 | +## Ajouter une institution (8 étapes) | |
| 12 | + | |
| 13 | +1. **Créer `<slug>.py`** dans ce dossier, avec une sous-classe de | |
| 14 | + `RateProvider` : | |
| 15 | + | |
| 16 | + ```python | |
| 17 | + from .base import RateProvider | |
| 18 | + | |
| 19 | + class MaBanque(RateProvider): | |
| 20 | + provider_id = "ma_banque" # slug stable (clé BD) | |
| 21 | + institution = "Ma Banque" # nom d'affichage fr-CA | |
| 22 | + source_url = "https://mabanque.ca/taux-hypothecaires" | |
| 23 | + | |
| 24 | + def fetch(self) -> list[dict]: | |
| 25 | + html = self.get(self.source_url).text # ou .json() | |
| 26 | + return self.parse(html) | |
| 27 | + | |
| 28 | + def parse(self, html: str) -> list[dict]: | |
| 29 | + ... # → [self.make_product(...), ...] | |
| 30 | + ``` | |
| 31 | + | |
| 32 | + Séparer `fetch()` (réseau) de `parse()` (pur) : les tests appellent | |
| 33 | + `parse()` sur des fixtures, sans réseau. | |
| 34 | + | |
| 35 | +2. **Backend réseau** : `self.get(url)` (requests + politesse `request_delay`) | |
| 36 | + d'abord ; `self.get_scrapfly(url, render_js=True)` **en dernier recours | |
| 37 | + seulement** si le site bloque (403/JS requis). | |
| 38 | + | |
| 39 | +3. **Normaliser** chaque produit via `self.make_product(...)` : | |
| 40 | + - `rate_type` : `fixed` / `variable` — ou **`other` pour tout taux | |
| 41 | + préférentiel/prime/référence** (avec `purpose="unknown"`), afin qu'il ne | |
| 42 | + tombe jamais dans un classement « meilleur taux d'achat » ; | |
| 43 | + - `kind` : `posted` (affiché) ou `special` (offre spéciale) — ne jamais | |
| 44 | + confondre ; | |
| 45 | + - `insured_status` : `insured` / `insurable` / `uninsured`, ou `unknown` | |
| 46 | + si la page ne le précise pas — ne pas deviner ; | |
| 47 | + - `product_name` en français, explicite (ex. « Fixe fermé 5 ans ») ; | |
| 48 | + - `apr` (TAP) seulement s'il est publié. | |
| 49 | + | |
| 50 | +4. **Aucune écriture BD** dans le provider : le scheduler valide | |
| 51 | + (`validate_batch`) puis enregistre (`store.record_observations`). Ne pas | |
| 52 | + filtrer soi-même les aberrations — la validation s'en charge et journalise. | |
| 53 | + | |
| 54 | +5. **Fixture** : sauvegarder la réponse réelle (HTML/JSON) dans | |
| 55 | + `tests/fixtures/mortgage/<slug>.<ext>` (anonymisée si besoin, taille | |
| 56 | + raisonnable — garder le bloc utile). | |
| 57 | + | |
| 58 | +6. **Test** : ajouter le slug dans `EXPECTED` de | |
| 59 | + `tests/test_mortgage_providers.py` (fixture + nombre exact de produits) ; | |
| 60 | + le test générique vérifie déjà validation propre, `source_url`, | |
| 61 | + `institution` et la règle « préférentiel → other/unknown ». Ajouter un | |
| 62 | + test ciblé sur 1–2 valeurs connues de la fixture. | |
| 63 | + | |
| 64 | +7. **Exécuter** : | |
| 65 | + | |
| 66 | + ```bash | |
| 67 | + PYTHONPATH=. .venv/bin/python -P -m unittest tests.test_mortgage_providers | |
| 68 | + .venv/bin/python run.py mortgage-sync ma_banque # collecte réelle | |
| 69 | + .venv/bin/python run.py mortgage-status # santé | |
| 70 | + ``` | |
| 71 | + | |
| 72 | +8. **Vérifier en BD/API** : `GET /api/mortgage/rates?provider=ma_banque` — | |
| 73 | + provenance (`source_url`), fraîcheur et nature correctes. C'est tout : | |
| 74 | + ni web.py, ni le scheduler, ni le frontend n'ont besoin d'être modifiés. | |
| 75 | + | |
| 76 | +## Pièges connus | |
| 77 | + | |
| 78 | +- `4.19 % → 419` : toujours vérifier l'échelle ; la validation rejette | |
| 79 | + > 24 %, mais un « 41,9 » passerait — parser au bon endroit. | |
| 80 | +- Pages avec plusieurs onglets (assuré/non assuré) : étiqueter | |
| 81 | + `insured_status` correctement plutôt que de tout mélanger. | |
| 82 | +- Taux « ouverts » vs « fermés » : les distinguer dans `product_name` | |
| 83 | + (ex. BNC publie « Fixe ouvert 1 an » à 9,65 % — ce n'est pas une erreur). | |
| 84 | +- Ne jamais soumettre de formulaire ni simuler une demande de prêt : pages | |
| 85 | + publiques de taux uniquement. | |
added
immoka/mortgage/providers/__init__.py
+25 −0
@@ -0,0 +1,25 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/ : un connecteur indépendant par institution financière. | |
| 5 | +# Auto-découverte : tout module du dossier définissant une sous-classe de | |
| 6 | +# RateProvider avec provider_id non vide est enregistré automatiquement | |
| 7 | +# (même mécanique que immoka/connectors/). | |
| 8 | +# ----------------------------------------------------------------------------- | |
| 9 | +from __future__ import annotations | |
| 10 | + | |
| 11 | +import importlib | |
| 12 | +import pkgutil | |
| 13 | + | |
| 14 | +from .base import RateProvider | |
| 15 | + | |
| 16 | +PROVIDERS: dict[str, type[RateProvider]] = {} | |
| 17 | + | |
| 18 | +for _mod in pkgutil.iter_modules(__path__): | |
| 19 | + if _mod.name.startswith("_") or _mod.name == "base": | |
| 20 | + continue | |
| 21 | + module = importlib.import_module(f".{_mod.name}", __name__) | |
| 22 | + for obj in vars(module).values(): | |
| 23 | + if (isinstance(obj, type) and issubclass(obj, RateProvider) | |
| 24 | + and obj is not RateProvider and obj.provider_id): | |
| 25 | + PROVIDERS[obj.provider_id] = obj | |
added
immoka/mortgage/providers/bank_of_canada.py
+77 −0
@@ -0,0 +1,77 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/bank_of_canada.py : Banque du Canada — API Valet | |
| 5 | +# (officielle, publique, JSON). Séries de référence : taux hypothécaire | |
| 6 | +# conventionnel affiché 1/3/5 ans, taux directeur, rendement obligataire | |
| 7 | +# 5 ans. purpose="unknown" : séries de RÉFÉRENCE, exclues du comparateur | |
| 8 | +# de prêteurs (la BdC ne prête pas aux particuliers). | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +from .base import RateProvider | |
| 13 | + | |
| 14 | +SERIES_URL = ("https://www.bankofcanada.ca/valet/observations/" | |
| 15 | + "V80691333,V80691334,V80691335,V39079,BD.CDN.5YR.DQ.YLD/" | |
| 16 | + "json?recent=10") | |
| 17 | + | |
| 18 | +# série -> (terme mois, nom de produit) | |
| 19 | +MORTGAGE_SERIES = { | |
| 20 | + "V80691333": (12, "Taux hypothécaire conventionnel affiché — 1 an"), | |
| 21 | + "V80691334": (36, "Taux hypothécaire conventionnel affiché — 3 ans"), | |
| 22 | + "V80691335": (60, "Taux hypothécaire conventionnel affiché — 5 ans"), | |
| 23 | +} | |
| 24 | +CONTEXT_SERIES = { | |
| 25 | + "V39079": "Taux cible du financement à un jour", | |
| 26 | + "BD.CDN.5YR.DQ.YLD": "Rendement obligataire 5 ans — Gouvernement du Canada", | |
| 27 | +} | |
| 28 | + | |
| 29 | + | |
| 30 | +class BankOfCanadaProvider(RateProvider): | |
| 31 | + provider_id = "bank_of_canada" | |
| 32 | + institution = "Banque du Canada" | |
| 33 | + source_url = "https://www.bankofcanada.ca/rates/interest-rates/" | |
| 34 | + request_delay = 0.5 | |
| 35 | + | |
| 36 | + def fetch(self) -> list[dict]: | |
| 37 | + return self.parse(self.get(SERIES_URL).text) | |
| 38 | + | |
| 39 | + def parse(self, payload: str) -> list[dict]: | |
| 40 | + import json | |
| 41 | + data = json.loads(payload) | |
| 42 | + observations = data.get("observations") or [] | |
| 43 | + # Séries à fréquences mélangées : garder la DERNIÈRE valeur par série. | |
| 44 | + latest: dict[str, tuple[str, float]] = {} | |
| 45 | + for obs in observations: | |
| 46 | + d = obs.get("d", "") | |
| 47 | + for sid, cell in obs.items(): | |
| 48 | + if sid == "d" or not isinstance(cell, dict): | |
| 49 | + continue | |
| 50 | + v = cell.get("v") | |
| 51 | + if v in (None, ""): | |
| 52 | + continue | |
| 53 | + try: | |
| 54 | + latest[sid] = (d, float(v)) | |
| 55 | + except ValueError: | |
| 56 | + continue | |
| 57 | + out: list[dict] = [] | |
| 58 | + for sid, (term, name) in MORTGAGE_SERIES.items(): | |
| 59 | + if sid not in latest: | |
| 60 | + continue | |
| 61 | + d, v = latest[sid] | |
| 62 | + out.append(self.make_product( | |
| 63 | + rate=v, rate_type="fixed", term_months=term, kind="posted", | |
| 64 | + product_name=name, purpose="unknown", | |
| 65 | + conditions=f"Série Valet {sid} — observation du {d} " | |
| 66 | + "(moyenne hebdomadaire des taux affichés)", | |
| 67 | + raw={"series": sid, "date": d, "value": v})) | |
| 68 | + for sid, name in CONTEXT_SERIES.items(): | |
| 69 | + if sid not in latest: | |
| 70 | + continue | |
| 71 | + d, v = latest[sid] | |
| 72 | + out.append(self.make_product( | |
| 73 | + rate=v, rate_type="other", term_months=12, kind="posted", | |
| 74 | + product_name=name, purpose="unknown", | |
| 75 | + conditions=f"Série Valet {sid} — observation du {d}", | |
| 76 | + raw={"series": sid, "date": d, "value": v})) | |
| 77 | + return out | |
added
immoka/mortgage/providers/base.py
+133 −0
@@ -0,0 +1,133 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/base.py : classe de base des connecteurs de taux. | |
| 5 | +# Contrat : fetch() retourne la liste des produits NORMALISÉS de | |
| 6 | +# l'institution (dicts au format de make_product). Aucune écriture BD ici — | |
| 7 | +# le scheduler valide puis enregistre. Jamais de taux inventé : un produit | |
| 8 | +# non confirmé est simplement omis. | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import os | |
| 13 | +import re | |
| 14 | +import time | |
| 15 | + | |
| 16 | +import requests | |
| 17 | + | |
| 18 | +USER_AGENT = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " | |
| 19 | + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126 Safari/537.36 " | |
| 20 | + "ImmoKaBot/1.0 (+https://www.immo-ka.com/bot; contact@spboucher.ai)") | |
| 21 | + | |
| 22 | +SCRAPFLY_API = "https://api.scrapfly.io/scrape" | |
| 23 | + | |
| 24 | + | |
| 25 | +class RateProvider: | |
| 26 | + provider_id: str = "" # slug (rbc, td, desjardins…) | |
| 27 | + institution: str = "" # nom d'affichage | |
| 28 | + source_url: str = "" # page officielle des taux (lien public) | |
| 29 | + request_delay: float = 1.0 # politesse | |
| 30 | + timeout: int = 30 | |
| 31 | + | |
| 32 | + def __init__(self) -> None: | |
| 33 | + self.session = requests.Session() | |
| 34 | + self.session.headers["User-Agent"] = USER_AGENT | |
| 35 | + self._last_request = 0.0 | |
| 36 | + | |
| 37 | + # -- backends ------------------------------------------------------------- | |
| 38 | + def get(self, url: str, **kw) -> requests.Response: | |
| 39 | + wait = self.request_delay - (time.time() - self._last_request) | |
| 40 | + if wait > 0: | |
| 41 | + time.sleep(wait) | |
| 42 | + resp = self.session.get(url, timeout=self.timeout, **kw) | |
| 43 | + self._last_request = time.time() | |
| 44 | + resp.raise_for_status() | |
| 45 | + return resp | |
| 46 | + | |
| 47 | + def get_scrapfly(self, url: str, render_js: bool = False, | |
| 48 | + asp: bool = True, country: str = "ca") -> str: | |
| 49 | + """HTML via Scrapfly (anti-bot) — dernier recours seulement.""" | |
| 50 | + key = os.environ.get("SCRAPFLY_KEY") or os.environ.get("SCRAPFLY_API_KEY") | |
| 51 | + if not key: | |
| 52 | + raise RuntimeError("SCRAPFLY_KEY manquant (voir .env)") | |
| 53 | + params: dict = {"key": key, "url": url, "country": country} | |
| 54 | + if asp: | |
| 55 | + params["asp"] = "true" | |
| 56 | + if render_js: | |
| 57 | + params["render_js"] = "true" | |
| 58 | + wait = self.request_delay - (time.time() - self._last_request) | |
| 59 | + if wait > 0: | |
| 60 | + time.sleep(wait) | |
| 61 | + resp = requests.get(SCRAPFLY_API, params=params, timeout=180) | |
| 62 | + self._last_request = time.time() | |
| 63 | + try: | |
| 64 | + return (resp.json().get("result") or {}).get("content") or "" | |
| 65 | + except ValueError: | |
| 66 | + return "" | |
| 67 | + | |
| 68 | + # -- normalisation -------------------------------------------------------- | |
| 69 | + def make_product(self, *, rate: float, rate_type: str, term_months: int, | |
| 70 | + kind: str, product_name: str | None = None, | |
| 71 | + apr: float | None = None, | |
| 72 | + insured_status: str = "unknown", | |
| 73 | + purpose: str = "purchase", | |
| 74 | + amortization_max_years: int | None = None, | |
| 75 | + conditions: str | None = None, | |
| 76 | + source_url: str | None = None, | |
| 77 | + confidence: float = 1.0, | |
| 78 | + raw=None) -> dict: | |
| 79 | + """Observation normalisée commune à tous les providers.""" | |
| 80 | + return { | |
| 81 | + "provider": self.provider_id, | |
| 82 | + "institution": self.institution, | |
| 83 | + "product_name": product_name, | |
| 84 | + "rate_type": rate_type, | |
| 85 | + "term_months": int(term_months), | |
| 86 | + "kind": kind, | |
| 87 | + "rate": round(float(rate), 4), | |
| 88 | + "apr": round(float(apr), 4) if apr is not None else None, | |
| 89 | + "insured_status": insured_status, | |
| 90 | + "purpose": purpose, | |
| 91 | + "amortization_max_years": amortization_max_years, | |
| 92 | + "conditions": conditions, | |
| 93 | + "source_url": source_url or self.source_url, | |
| 94 | + "confidence": confidence, | |
| 95 | + "raw": raw, | |
| 96 | + } | |
| 97 | + | |
| 98 | + # -- contrat -------------------------------------------------------------- | |
| 99 | + def fetch(self) -> list[dict]: | |
| 100 | + raise NotImplementedError | |
| 101 | + | |
| 102 | + # Point d'entrée pour les tests avec fixtures : si le provider parse un | |
| 103 | + # payload texte, il expose parse(payload) et fetch() = parse(download()). | |
| 104 | + def parse(self, payload: str) -> list[dict]: # pragma: no cover | |
| 105 | + raise NotImplementedError | |
| 106 | + | |
| 107 | + | |
| 108 | +def parse_rate(text: str) -> float | None: | |
| 109 | + """Extrait un taux en % d'un texte : '4,19 %', '4.19%', ' 4.19 '. | |
| 110 | + Retourne None si introuvable — jamais de valeur devinée.""" | |
| 111 | + if text is None: | |
| 112 | + return None | |
| 113 | + m = re.search(r"(\d{1,2}(?:[.,]\d{1,4})?)\s*%?", str(text).strip()) | |
| 114 | + if not m: | |
| 115 | + return None | |
| 116 | + try: | |
| 117 | + return float(m.group(1).replace(",", ".")) | |
| 118 | + except ValueError: | |
| 119 | + return None | |
| 120 | + | |
| 121 | + | |
| 122 | +def term_to_months(text: str) -> int | None: | |
| 123 | + """'5 ans', '5 year', '5-year', '6 months', '6 mois' → mois.""" | |
| 124 | + if not text: | |
| 125 | + return None | |
| 126 | + t = str(text).lower() | |
| 127 | + m = re.search(r"(\d{1,3})\s*(?:-|\s)?\s*(an|ans|année|year|yr)", t) | |
| 128 | + if m: | |
| 129 | + return int(m.group(1)) * 12 | |
| 130 | + m = re.search(r"(\d{1,3})\s*(?:-|\s)?\s*(mois|month)", t) | |
| 131 | + if m: | |
| 132 | + return int(m.group(1)) | |
| 133 | + return None | |
added
immoka/mortgage/providers/bmo.py
+135 −0
@@ -0,0 +1,135 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/bmo.py : BMO — 3 JSON publics public-data (spéciaux, | |
| 5 | +# grille affichée EPM, prime). ⚠️ bmo.com filtre l'empreinte TLS (Akamai) : | |
| 6 | +# cascade requests → curl_cffi (si dispo) → Scrapfly asp. Les clés Over25 | |
| 7 | +# sont les variantes amortissement > 25 ans ; 18YearOpen et 12Variable* | |
| 8 | +# sont des reliquats hérités (valeurs figées) et sont ignorés. | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import json | |
| 13 | + | |
| 14 | +from .base import RateProvider | |
| 15 | + | |
| 16 | +URLS = { | |
| 17 | + "ca-mortgages-special-rates": | |
| 18 | + "https://www.bmo.com/public-data/api/v2.0/bmo-ca-mortgages-rates.json", | |
| 19 | + "epm-mortgage": | |
| 20 | + "https://www.bmo.com/public-data/api/epm/v1.0/bmo-epm-mortgage.json", | |
| 21 | + "epm-prime": | |
| 22 | + "https://www.bmo.com/public-data/api/epm/v1.0/bmo-epm-prime.json", | |
| 23 | +} | |
| 24 | +PAGE_URL = "https://www.bmo.com/en-ca/main/personal/mortgages/mortgage-rates/" | |
| 25 | + | |
| 26 | +# clé spéciale -> (rate_type, terme mois, nom, clé APR, amort max, insured) | |
| 27 | +SPECIAL_MAP: dict[str, tuple] = { | |
| 28 | + "fixed3YearClosedSpecial": | |
| 29 | + ("fixed", 36, "Fixe fermé 3 ans (offre spéciale)", | |
| 30 | + "fixed3YearClosedSpecialApr", 25, "unknown"), | |
| 31 | + "fixed3YearClosedSpecialOver25": | |
| 32 | + ("fixed", 36, "Fixe fermé 3 ans (offre spéciale, amort. >25 ans)", | |
| 33 | + "fixed3YearClosedSpecialOver25Apr", 30, "uninsured"), | |
| 34 | + "smartFixed5YearClosedSpecial": | |
| 35 | + ("fixed", 60, "Smart Fixed fermé 5 ans (offre spéciale)", | |
| 36 | + "smartFixed5YearClosedSpecialApr", 25, "uninsured"), | |
| 37 | + "smartFixed5YearClosedHighRatioSpecial": | |
| 38 | + ("fixed", 60, "Smart Fixed fermé 5 ans (offre spéciale, ratio élevé)", | |
| 39 | + "smartFixed5YearClosedHighRatioSpecialApr", 25, "insured"), | |
| 40 | + "variable5YearClosedSpecial": | |
| 41 | + ("variable", 60, "Variable fermé 5 ans (offre spéciale)", | |
| 42 | + "variable5YearClosedSpecialApr", 25, "unknown"), | |
| 43 | + "variable5YearClosedSpecialOver25": | |
| 44 | + ("variable", 60, "Variable fermé 5 ans (offre spéciale, amort. >25 ans)", | |
| 45 | + "variable5YearClosedSpecialOver25Apr", 30, "uninsured"), | |
| 46 | +} | |
| 47 | + | |
| 48 | +EPM_SKIP = {"18YearOpen", "12VariableLimited", "12VariableOpen"} | |
| 49 | + | |
| 50 | + | |
| 51 | +def _num(v) -> float | None: | |
| 52 | + try: | |
| 53 | + return float(str(v).strip()) | |
| 54 | + except (TypeError, ValueError): | |
| 55 | + return None | |
| 56 | + | |
| 57 | + | |
| 58 | +class BmoProvider(RateProvider): | |
| 59 | + provider_id = "bmo" | |
| 60 | + institution = "BMO Banque de Montréal" | |
| 61 | + source_url = PAGE_URL | |
| 62 | + request_delay = 1.2 | |
| 63 | + | |
| 64 | + def _get_json_text(self, url: str) -> str: | |
| 65 | + try: | |
| 66 | + return self.get(url).text | |
| 67 | + except Exception: # noqa: BLE001 — TLS Akamai : on escalade | |
| 68 | + pass | |
| 69 | + try: | |
| 70 | + from curl_cffi import requests as curl_requests | |
| 71 | + resp = curl_requests.get(url, impersonate="chrome", | |
| 72 | + timeout=self.timeout) | |
| 73 | + resp.raise_for_status() | |
| 74 | + return resp.text | |
| 75 | + except ImportError: | |
| 76 | + pass | |
| 77 | + return self.get_scrapfly(url, render_js=False, asp=True) | |
| 78 | + | |
| 79 | + def fetch(self) -> list[dict]: | |
| 80 | + docs: dict[str, dict] = {} | |
| 81 | + for key, url in URLS.items(): | |
| 82 | + text = self._get_json_text(url) | |
| 83 | + docs[key] = json.loads(text) | |
| 84 | + return self.parse_docs(docs) | |
| 85 | + | |
| 86 | + def parse(self, payload: str) -> list[dict]: | |
| 87 | + """Pour les tests fixtures : payload = JSON {clé: {url, payload}}.""" | |
| 88 | + data = json.loads(payload) | |
| 89 | + docs: dict[str, dict] = {} | |
| 90 | + for key, entry in data.items(): | |
| 91 | + doc = entry.get("payload") if isinstance(entry, dict) and \ | |
| 92 | + "payload" in entry else entry | |
| 93 | + if isinstance(doc, str): | |
| 94 | + doc = json.loads(doc) | |
| 95 | + docs[key] = doc | |
| 96 | + return self.parse_docs(docs) | |
| 97 | + | |
| 98 | + def parse_docs(self, docs: dict[str, dict]) -> list[dict]: | |
| 99 | + out: list[dict] = [] | |
| 100 | + specials = docs.get("ca-mortgages-special-rates") or {} | |
| 101 | + for key, (rtype, term, name, apr_key, amort, insured) in \ | |
| 102 | + SPECIAL_MAP.items(): | |
| 103 | + rate = _num(specials.get(key)) | |
| 104 | + if rate is None or rate <= 0: | |
| 105 | + continue | |
| 106 | + out.append(self.make_product( | |
| 107 | + rate=rate, rate_type=rtype, term_months=term, kind="special", | |
| 108 | + product_name=name, apr=_num(specials.get(apr_key)), | |
| 109 | + insured_status=insured, amortization_max_years=amort, | |
| 110 | + raw={"key": key, "value": specials.get(key)})) | |
| 111 | + epm = docs.get("epm-mortgage") or {} | |
| 112 | + grid = epm.get("mortgageRates") or epm | |
| 113 | + for rtype_key, rtype, prefix in (("fixed", "fixed", "Fixe"), | |
| 114 | + ("variable", "variable", "Variable")): | |
| 115 | + for key, cell in (grid.get(rtype_key) or {}).items(): | |
| 116 | + if key in EPM_SKIP or not isinstance(cell, dict): | |
| 117 | + continue | |
| 118 | + rate = _num(cell.get("value")) | |
| 119 | + term = _num(cell.get("term_months")) | |
| 120 | + if rate is None or rate <= 0 or not term: | |
| 121 | + continue | |
| 122 | + label = cell.get("fr") or cell.get("en") or key | |
| 123 | + out.append(self.make_product( | |
| 124 | + rate=rate, rate_type=rtype, term_months=int(term), | |
| 125 | + kind="posted", product_name=f"{prefix} {label}", | |
| 126 | + raw={"key": key, "cell": cell})) | |
| 127 | + prime = docs.get("epm-prime") or {} | |
| 128 | + prime_rate = _num((prime.get("caPrimeRate") or {}).get("value")) | |
| 129 | + if prime_rate and prime_rate > 0: | |
| 130 | + out.append(self.make_product( | |
| 131 | + rate=prime_rate, rate_type="other", term_months=12, | |
| 132 | + kind="posted", product_name="Taux préférentiel BMO", | |
| 133 | + purpose="unknown", | |
| 134 | + raw={"caPrimeRate": prime.get("caPrimeRate")})) | |
| 135 | + return out | |
added
immoka/mortgage/providers/cibc.py
+144 −0
@@ -0,0 +1,144 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/cibc.py : CIBC — pseudo-JSON JS productRatesLegacy | |
| 5 | +# (blocs `var CODE = {...}` avec lignes [terme, ?, colId, valeur, …]). | |
| 6 | +# colId 1 = affiché, 18 = spécial, 2 = APR du spécial ; sentinelle | |
| 7 | +# -99.999999991 et spécial 0.00 = non publié ; colId 34 = colonne | |
| 8 | +# d'identité inconnue, jamais devinée. MICRO/MICROVAR ne portent que | |
| 9 | +# l'offre spéciale (leur « affiché » duplique FRCM). | |
| 10 | +# ----------------------------------------------------------------------------- | |
| 11 | +from __future__ import annotations | |
| 12 | + | |
| 13 | +import re | |
| 14 | + | |
| 15 | +from .base import RateProvider | |
| 16 | + | |
| 17 | +BASE_URL = ("https://www.cibconline.cibc.com/ebm-pno/api/v1/json/" | |
| 18 | + "productRatesLegacy?lobId={lob}&sourceProductCode={codes}") | |
| 19 | +LOB5_CODES = "FRCM,FOM,CCM,5YRVARCLO,MICRO,MICROVAR,VROM" | |
| 20 | +PAGE_URL = "https://www.cibc.com/en/interest-rates/mortgage-rates.html" | |
| 21 | + | |
| 22 | +COL_POSTED, COL_APR, COL_SPECIAL = 1, 2, 18 | |
| 23 | +SENTINEL = -99.0 | |
| 24 | + | |
| 25 | +# code -> (rate_type, libellé de base, spécial seulement, libellé du spécial) | |
| 26 | +PRODUCTS: dict[str, tuple] = { | |
| 27 | + "FRCM": ("fixed", "Fixe fermé", False, "offre spéciale"), | |
| 28 | + "FOM": ("fixed", "Fixe ouvert", False, "offre spéciale"), | |
| 29 | + "CCM": ("fixed", "Fermé convertible", False, "offre spéciale"), | |
| 30 | + "5YRVARCLO": ("variable", "Variable Flex fermé", False, "offre spéciale"), | |
| 31 | + "VROM": ("variable", "Variable ouvert", False, "offre spéciale"), | |
| 32 | + # MICRO/MICROVAR : l'offre mise en avant sur la page des taux — libellé | |
| 33 | + # distinct pour ne pas entrer en collision avec le spécial FRCM/5YRVARCLO. | |
| 34 | + "MICRO": ("fixed", "Fixe fermé", True, "offre annoncée"), | |
| 35 | + "MICROVAR": ("variable", "Variable Flex fermé", True, "offre annoncée"), | |
| 36 | +} | |
| 37 | + | |
| 38 | +BLOCK_RX = re.compile(r"var\s+(\w+)\s*=\s*\{(.*?)\]\s*\}", re.S) | |
| 39 | +ROW_RX = re.compile(r"\[([^\[\]]*)\]") | |
| 40 | +TERM_RX = re.compile(r"^(\d{1,3})_.*_(Year|Years|Month|Months)_T$") | |
| 41 | + | |
| 42 | + | |
| 43 | +def _cells(row: str) -> list: | |
| 44 | + out = [] | |
| 45 | + for cell in row.split(","): | |
| 46 | + c = cell.strip().strip("'\"") | |
| 47 | + out.append(None if c == "null" else c) | |
| 48 | + return out | |
| 49 | + | |
| 50 | + | |
| 51 | +def _term_months(token) -> int | None: | |
| 52 | + m = TERM_RX.match(str(token or "")) | |
| 53 | + if not m: | |
| 54 | + return None | |
| 55 | + n = int(m.group(1)) | |
| 56 | + return n * 12 if m.group(2).startswith("Year") else n | |
| 57 | + | |
| 58 | + | |
| 59 | +def _num(v) -> float | None: | |
| 60 | + try: | |
| 61 | + return float(str(v).strip()) | |
| 62 | + except (TypeError, ValueError): | |
| 63 | + return None | |
| 64 | + | |
| 65 | + | |
| 66 | +def _label(months: int) -> str: | |
| 67 | + if months < 12: | |
| 68 | + return f"{months} mois" | |
| 69 | + years = months // 12 | |
| 70 | + return f"{years} an" if years == 1 else f"{years} ans" | |
| 71 | + | |
| 72 | + | |
| 73 | +class CibcProvider(RateProvider): | |
| 74 | + provider_id = "cibc" | |
| 75 | + institution = "CIBC" | |
| 76 | + source_url = PAGE_URL | |
| 77 | + request_delay = 1.2 | |
| 78 | + | |
| 79 | + def fetch(self) -> list[dict]: | |
| 80 | + text = self.get(BASE_URL.format(lob=5, codes=LOB5_CODES)).text | |
| 81 | + try: | |
| 82 | + text += "\n" + self.get(BASE_URL.format(lob=1, codes="PRIME")).text | |
| 83 | + except Exception: # noqa: BLE001 — prime facultatif | |
| 84 | + pass | |
| 85 | + return self.parse(text) | |
| 86 | + | |
| 87 | + def parse(self, payload: str) -> list[dict]: | |
| 88 | + out: list[dict] = [] | |
| 89 | + for var_name, body in BLOCK_RX.findall(payload): | |
| 90 | + name = var_name[1:] if var_name[:1] == "p" and \ | |
| 91 | + var_name[1:2].isdigit() else var_name | |
| 92 | + if name == "PRIME": | |
| 93 | + out.extend(self._parse_prime(body)) | |
| 94 | + continue | |
| 95 | + if name not in PRODUCTS: | |
| 96 | + continue | |
| 97 | + rtype, base_label, special_only, special_label = PRODUCTS[name] | |
| 98 | + # (terme -> {colId: valeur}) | |
| 99 | + grid: dict[int, dict[int, float]] = {} | |
| 100 | + for row in ROW_RX.findall(body): | |
| 101 | + cells = _cells(row) | |
| 102 | + if len(cells) < 4: | |
| 103 | + continue | |
| 104 | + term = _term_months(cells[0]) | |
| 105 | + col = _num(cells[2]) | |
| 106 | + val = _num(cells[3]) | |
| 107 | + if term is None or col is None or val is None: | |
| 108 | + continue | |
| 109 | + if val < SENTINEL + 1 or val <= 0: | |
| 110 | + continue # sentinelle -99.999999991 ou 0.00 : non publié | |
| 111 | + grid.setdefault(term, {})[int(col)] = val | |
| 112 | + for term, cols in sorted(grid.items()): | |
| 113 | + posted = cols.get(COL_POSTED) | |
| 114 | + special = cols.get(COL_SPECIAL) | |
| 115 | + if posted and not special_only: | |
| 116 | + out.append(self.make_product( | |
| 117 | + rate=posted, rate_type=rtype, term_months=term, | |
| 118 | + kind="posted", | |
| 119 | + product_name=f"{base_label} {_label(term)}", | |
| 120 | + conditions="Base = taux préférentiel CIBC" | |
| 121 | + if rtype == "variable" and name == "5YRVARCLO" | |
| 122 | + else None, | |
| 123 | + raw={"code": name, "cols": cols})) | |
| 124 | + if special: | |
| 125 | + out.append(self.make_product( | |
| 126 | + rate=special, rate_type=rtype, term_months=term, | |
| 127 | + kind="special", apr=cols.get(COL_APR), | |
| 128 | + product_name=f"{base_label} {_label(term)} " | |
| 129 | + f"({special_label})", | |
| 130 | + raw={"code": name, "cols": cols})) | |
| 131 | + return out | |
| 132 | + | |
| 133 | + def _parse_prime(self, body: str) -> list[dict]: | |
| 134 | + for row in ROW_RX.findall(body): | |
| 135 | + cells = _cells(row) | |
| 136 | + if len(cells) < 4: | |
| 137 | + continue | |
| 138 | + rate = _num(cells[3]) | |
| 139 | + if rate and rate > 0: | |
| 140 | + return [self.make_product( | |
| 141 | + rate=rate, rate_type="other", term_months=12, | |
| 142 | + kind="posted", product_name="Taux préférentiel CIBC", | |
| 143 | + purpose="unknown", raw={"code": "PRIME", "value": rate})] | |
| 144 | + return [] | |
added
immoka/mortgage/providers/desjardins.py
+83 −0
@@ -0,0 +1,83 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/desjardins.py : Desjardins — JSON server-rendered | |
| 5 | +# window.dcomProducts sur la page des taux. Clé = cfPath COMPLET (le même | |
| 6 | +# id existe dans les familles « taux-hypothecaires » (affichés) et | |
| 7 | +# « taux-hypothecaires-promotionnels » (spéciaux) avec des valeurs | |
| 8 | +# différentes — ne jamais confondre). | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import json | |
| 13 | +import re | |
| 14 | + | |
| 15 | +from .base import RateProvider | |
| 16 | + | |
| 17 | +PAGE_URL = "https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html" | |
| 18 | + | |
| 19 | +# id Desjardins -> (rate_type, terme mois, nom, purpose) | |
| 20 | +ID_MAP: dict[str, tuple] = { | |
| 21 | + "6000_6M": ("fixed", 6, "Fixe fermé 6 mois"), | |
| 22 | + "6000_1A": ("fixed", 12, "Fixe fermé 1 an"), | |
| 23 | + "6000_2A": ("fixed", 24, "Fixe fermé 2 ans"), | |
| 24 | + "6000_3A": ("fixed", 36, "Fixe fermé 3 ans"), | |
| 25 | + "6000_4A": ("fixed", 48, "Fixe fermé 4 ans"), | |
| 26 | + "6000_5A": ("fixed", 60, "Fixe fermé 5 ans"), | |
| 27 | + "6000_6A": ("fixed", 72, "Fixe fermé 6 ans"), | |
| 28 | + "6000_7A": ("fixed", 84, "Fixe fermé 7 ans"), | |
| 29 | + "6000_10A": ("fixed", 120, "Fixe fermé 10 ans"), | |
| 30 | + "6000_6MO": ("fixed", 6, "Fixe ouvert 6 mois"), | |
| 31 | + "6000_1AO": ("fixed", 12, "Fixe ouvert 1 an"), | |
| 32 | + "6004_5AR": ("variable", 60, "Variable réduit 5 ans"), | |
| 33 | + "tvp": ("variable", 60, "Variable protégé 5 ans"), | |
| 34 | + "tvred": ("variable", 60, "Variable réduit"), | |
| 35 | + "tvreg": ("variable", 60, "Variable régulier"), | |
| 36 | + "tra": ("fixed", 12, "Révisable annuellement"), | |
| 37 | +} | |
| 38 | +PRIME_ID = "tpcad" | |
| 39 | + | |
| 40 | + | |
| 41 | +class DesjardinsProvider(RateProvider): | |
| 42 | + provider_id = "desjardins" | |
| 43 | + institution = "Desjardins" | |
| 44 | + source_url = PAGE_URL | |
| 45 | + request_delay = 1.5 | |
| 46 | + | |
| 47 | + def fetch(self) -> list[dict]: | |
| 48 | + return self.parse(self.get(self.source_url).text) | |
| 49 | + | |
| 50 | + def parse(self, payload: str) -> list[dict]: | |
| 51 | + m = re.search(r"window\.dcomProducts\s*=\s*(\{.*?\});", payload, re.S) | |
| 52 | + if not m: | |
| 53 | + raise ValueError("dcomProducts introuvable (structure changée)") | |
| 54 | + products = json.loads(m.group(1)) | |
| 55 | + out: list[dict] = [] | |
| 56 | + for cf_path, cell in products.items(): | |
| 57 | + if "/hypotheque/" not in cf_path or not isinstance(cell, dict): | |
| 58 | + continue | |
| 59 | + pid = cell.get("id") or "" | |
| 60 | + try: | |
| 61 | + rate = float(cell.get("rate")) | |
| 62 | + except (TypeError, ValueError): | |
| 63 | + continue | |
| 64 | + if rate <= 0: | |
| 65 | + continue | |
| 66 | + promo = "taux-hypothecaires-promotionnels" in cf_path | |
| 67 | + if pid == PRIME_ID: | |
| 68 | + out.append(self.make_product( | |
| 69 | + rate=rate, rate_type="other", term_months=12, | |
| 70 | + kind="posted", product_name="Taux préférentiel Desjardins", | |
| 71 | + purpose="unknown", raw={"cfPath": cf_path, "rate": rate})) | |
| 72 | + continue | |
| 73 | + if pid not in ID_MAP: | |
| 74 | + continue # id inconnu : jamais deviné | |
| 75 | + rtype, term, label = ID_MAP[pid] | |
| 76 | + out.append(self.make_product( | |
| 77 | + rate=rate, rate_type=rtype, term_months=term, | |
| 78 | + kind="special" if promo else "posted", | |
| 79 | + product_name=label + (" (promotion)" if promo else ""), | |
| 80 | + conditions="Taux promotionnel Desjardins" if promo | |
| 81 | + else "Taux affiché Desjardins", | |
| 82 | + raw={"cfPath": cf_path, "id": pid, "rate": cell.get("rate")})) | |
| 83 | + return out | |
added
immoka/mortgage/providers/eq_bank.py
+94 −0
@@ -0,0 +1,94 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/eq_bank.py : Banque EQ / Équitable — dictionnaire JSON | |
| 5 | +# global embarqué dans le payload Next.js de la page des taux (marqueur | |
| 6 | +# \"rates\":{ échappé). Clés CMS stables ; les clés « Adjustable » sont des | |
| 7 | +# ÉCARTS vs prime (jamais interprétées comme des taux). | |
| 8 | +# ----------------------------------------------------------------------------- | |
| 9 | +from __future__ import annotations | |
| 10 | + | |
| 11 | +import json | |
| 12 | + | |
| 13 | +from .base import RateProvider | |
| 14 | + | |
| 15 | +# clé CMS -> (rate_type, terme mois, kind, nom, clé APR éventuelle) | |
| 16 | +KEY_MAP: dict[str, tuple] = { | |
| 17 | + "mortgage-rate-fixed-5-year": ("fixed", 60, "special", | |
| 18 | + "Fixe 5 ans (vitrine EQ)", | |
| 19 | + "mortgage-rate-fixed-5-year-APR"), | |
| 20 | + "mortgage-rate-variable-5-year": ("variable", 60, "special", | |
| 21 | + "Variable 5 ans (vitrine EQ)", | |
| 22 | + "mortgage-rate-variable-5-year-APR"), | |
| 23 | + "es-fixed-12-month": ("fixed", 12, "special", "Evolution Suite — fixe 1 an", None), | |
| 24 | + "es-fixed-24-month": ("fixed", 24, "special", "Evolution Suite — fixe 2 ans", None), | |
| 25 | + "es-fixed-36-month": ("fixed", 36, "special", "Evolution Suite — fixe 3 ans", None), | |
| 26 | + "es-fixed-48-month": ("fixed", 48, "special", "Evolution Suite — fixe 4 ans", None), | |
| 27 | + "es-fixed-60-month": ("fixed", 60, "special", "Evolution Suite — fixe 5 ans", None), | |
| 28 | + "Standard-Mortgage-Rate-1-Year-Fixed": ("fixed", 12, "posted", "Fixe affiché 1 an", None), | |
| 29 | + "Standard-Mortgage-Rate-2-Year-Fixed": ("fixed", 24, "posted", "Fixe affiché 2 ans", None), | |
| 30 | + "Standard-Mortgage-Rate-3-Year-Fixed": ("fixed", 36, "posted", "Fixe affiché 3 ans", None), | |
| 31 | + "Standard-Mortgage-Rate-4-Year-Fixed": ("fixed", 48, "posted", "Fixe affiché 4 ans", None), | |
| 32 | + "Standard-Mortgage-Rate-5-Year-Fixed": ("fixed", 60, "posted", "Fixe affiché 5 ans", None), | |
| 33 | +} | |
| 34 | +PRIME_KEY = "equitable-prime-rate" | |
| 35 | + | |
| 36 | + | |
| 37 | +def extract_rates_blob(html: str) -> dict: | |
| 38 | + """Isole le dictionnaire {clé: {name, rate}} du payload Next.js. | |
| 39 | + Le JSON est échappé dans le HTML (\\\" -> \").""" | |
| 40 | + marker = '\\"rates\\":{' | |
| 41 | + i = html.find(marker) | |
| 42 | + if i < 0: | |
| 43 | + marker = '"rates":{' | |
| 44 | + i = html.find(marker) | |
| 45 | + if i < 0: | |
| 46 | + raise ValueError("marqueur rates introuvable (structure changée)") | |
| 47 | + seg = html[i:i + 400_000].replace('\\"', '"') | |
| 48 | + start = seg.find("{") | |
| 49 | + depth = 0 | |
| 50 | + for j, ch in enumerate(seg[start:], start): | |
| 51 | + if ch == "{": | |
| 52 | + depth += 1 | |
| 53 | + elif ch == "}": | |
| 54 | + depth -= 1 | |
| 55 | + if depth == 0: | |
| 56 | + return json.loads(seg[start:j + 1]) | |
| 57 | + raise ValueError("JSON rates non équilibré (structure changée)") | |
| 58 | + | |
| 59 | + | |
| 60 | +class EqBankProvider(RateProvider): | |
| 61 | + provider_id = "eq_bank" | |
| 62 | + institution = "Banque EQ" | |
| 63 | + source_url = "https://www.eqbank.ca/residential/mortgage-rates" | |
| 64 | + request_delay = 1.0 | |
| 65 | + | |
| 66 | + def fetch(self) -> list[dict]: | |
| 67 | + return self.parse(self.get(self.source_url).text) | |
| 68 | + | |
| 69 | + def parse(self, payload: str) -> list[dict]: | |
| 70 | + rates = extract_rates_blob(payload) | |
| 71 | + | |
| 72 | + def val(key: str) -> float | None: | |
| 73 | + cell = rates.get(key) | |
| 74 | + if isinstance(cell, dict) and isinstance(cell.get("rate"), (int, float)): | |
| 75 | + return float(cell["rate"]) | |
| 76 | + return None | |
| 77 | + | |
| 78 | + out: list[dict] = [] | |
| 79 | + for key, (rtype, term, kind, name, apr_key) in KEY_MAP.items(): | |
| 80 | + rate = val(key) | |
| 81 | + if rate is None: | |
| 82 | + continue # clé absente : produit omis, jamais deviné | |
| 83 | + apr = val(apr_key) if apr_key else None | |
| 84 | + out.append(self.make_product( | |
| 85 | + rate=rate, rate_type=rtype, term_months=term, kind=kind, | |
| 86 | + product_name=name, apr=apr, | |
| 87 | + raw={"key": key, "rate": rate, "apr": apr})) | |
| 88 | + prime = val(PRIME_KEY) | |
| 89 | + if prime is not None: | |
| 90 | + out.append(self.make_product( | |
| 91 | + rate=prime, rate_type="other", term_months=12, kind="posted", | |
| 92 | + product_name="Taux préférentiel Banque Équitable", | |
| 93 | + purpose="unknown", raw={"key": PRIME_KEY, "rate": prime})) | |
| 94 | + return out | |
added
immoka/mortgage/providers/first_national.py
+97 −0
@@ -0,0 +1,97 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/first_national.py : First National — table HTML statique | |
| 5 | +# (server-side, aucun anti-bot). Taux fixes fermés par catégorie | |
| 6 | +# assuré/assurable(LTV)/conventionnel, ARM « Prime - X% », prime maison. | |
| 7 | +# ----------------------------------------------------------------------------- | |
| 8 | +from __future__ import annotations | |
| 9 | + | |
| 10 | +import re | |
| 11 | + | |
| 12 | +from bs4 import BeautifulSoup | |
| 13 | + | |
| 14 | +from .base import RateProvider, parse_rate, term_to_months | |
| 15 | + | |
| 16 | + | |
| 17 | +def _insured_status(category: str) -> str: | |
| 18 | + c = category.lower() | |
| 19 | + if c.startswith("insured"): | |
| 20 | + return "insured" | |
| 21 | + if c.startswith("insurable"): | |
| 22 | + return "insurable" | |
| 23 | + if c.startswith("conventional"): | |
| 24 | + return "uninsured" | |
| 25 | + return "unknown" | |
| 26 | + | |
| 27 | + | |
| 28 | +class FirstNationalProvider(RateProvider): | |
| 29 | + provider_id = "first_national" | |
| 30 | + institution = "First National" | |
| 31 | + source_url = "https://www.firstnational.ca/residential/mortgage-rates" | |
| 32 | + request_delay = 1.0 | |
| 33 | + | |
| 34 | + def fetch(self) -> list[dict]: | |
| 35 | + return self.parse(self.get(self.source_url).text) | |
| 36 | + | |
| 37 | + def parse(self, payload: str) -> list[dict]: | |
| 38 | + soup = BeautifulSoup(payload, "html.parser") | |
| 39 | + out: list[dict] = [] | |
| 40 | + prime = None | |
| 41 | + m = re.search(r"First National Prime Rate:\s*(?:</?\w+[^>]*>\s*)*([\d.]+)", | |
| 42 | + payload) | |
| 43 | + if m: | |
| 44 | + prime = float(m.group(1)) | |
| 45 | + # -- taux fixes fermés (table avec aria-label par terme) -------------- | |
| 46 | + for h3 in soup.find_all("h3"): | |
| 47 | + title = h3.get_text(" ", strip=True) | |
| 48 | + table = h3.find_next("table") | |
| 49 | + if table is None: | |
| 50 | + continue | |
| 51 | + if title.lower().startswith("fixed rate mortgages"): | |
| 52 | + for tr in table.select("tbody tr"): | |
| 53 | + th = tr.find("th") | |
| 54 | + if th is None: | |
| 55 | + continue | |
| 56 | + category = re.sub(r"\s+", " ", th.get_text(" ", strip=True)) | |
| 57 | + status = _insured_status(category) | |
| 58 | + for td in tr.find_all("td"): | |
| 59 | + term = term_to_months(td.get("aria-label") or "") | |
| 60 | + rate = parse_rate(td.get_text(strip=True)) | |
| 61 | + if term is None or rate is None: | |
| 62 | + continue # cellule N/A : produit non offert | |
| 63 | + out.append(self.make_product( | |
| 64 | + rate=rate, rate_type="fixed", term_months=term, | |
| 65 | + kind="posted", | |
| 66 | + product_name=f"Fixe fermé — {category}", | |
| 67 | + insured_status=status, conditions=category, | |
| 68 | + raw={"category": category, | |
| 69 | + "cell": td.get_text(strip=True)})) | |
| 70 | + elif title.lower().startswith("adjustable rate"): | |
| 71 | + if prime is None: | |
| 72 | + continue # sans prime confirmée, ne rien deviner | |
| 73 | + for tr in table.select("tbody tr"): | |
| 74 | + th = tr.find("th") | |
| 75 | + td = tr.find("td") | |
| 76 | + if th is None or td is None: | |
| 77 | + continue | |
| 78 | + category = re.sub(r"\s+", " ", th.get_text(" ", strip=True)) | |
| 79 | + cell = td.get_text(" ", strip=True) | |
| 80 | + dm = re.search(r"Prime\s*([+-])\s*([\d.]+)\s*%", cell) | |
| 81 | + if not dm: | |
| 82 | + continue | |
| 83 | + delta = float(dm.group(2)) * (1 if dm.group(1) == "+" else -1) | |
| 84 | + out.append(self.make_product( | |
| 85 | + rate=round(prime + delta, 2), rate_type="adjustable", | |
| 86 | + term_months=60, kind="special", | |
| 87 | + product_name=f"ARM 5 ans — {category}", | |
| 88 | + insured_status=_insured_status(category), | |
| 89 | + conditions=f"{cell} (prime First National {prime} %)", | |
| 90 | + raw={"category": category, "cell": cell, | |
| 91 | + "prime": prime, "delta": delta})) | |
| 92 | + if prime is not None: | |
| 93 | + out.append(self.make_product( | |
| 94 | + rate=prime, rate_type="other", term_months=12, kind="posted", | |
| 95 | + product_name="Taux préférentiel First National", | |
| 96 | + purpose="unknown", raw={"prime": prime})) | |
| 97 | + return out | |
added
immoka/mortgage/providers/mcap.py
+40 −0
@@ -0,0 +1,40 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/mcap.py : MCAP — distribution 100 % courtiers, aucune | |
| 5 | +# table publique de taux par terme (vérifié 2026-08). Seul signal public : | |
| 6 | +# le taux préférentiel MCAP (+ date d'effet). Collecté comme référence, | |
| 7 | +# exclu du comparateur de prêteurs (rate_type="other", purpose="unknown"). | |
| 8 | +# ----------------------------------------------------------------------------- | |
| 9 | +from __future__ import annotations | |
| 10 | + | |
| 11 | +import re | |
| 12 | + | |
| 13 | +from .base import RateProvider | |
| 14 | + | |
| 15 | + | |
| 16 | +class McapProvider(RateProvider): | |
| 17 | + provider_id = "mcap" | |
| 18 | + institution = "MCAP" | |
| 19 | + source_url = ("https://www.mcap.com/residential-mortgages/advice/" | |
| 20 | + "mortgage-rates-canada") | |
| 21 | + request_delay = 1.0 | |
| 22 | + | |
| 23 | + def fetch(self) -> list[dict]: | |
| 24 | + return self.parse(self.get(self.source_url).text) | |
| 25 | + | |
| 26 | + def parse(self, payload: str) -> list[dict]: | |
| 27 | + m = re.search( | |
| 28 | + r'prime-rate-module.*?round-number-box[^>]*>\s*([\d.]+)\s*%', | |
| 29 | + payload, re.S) | |
| 30 | + if not m: | |
| 31 | + return [] | |
| 32 | + prime = float(m.group(1)) | |
| 33 | + dm = re.search(r'Effective\s+([A-Z][a-z]+ \d{1,2},? \d{4})', payload) | |
| 34 | + conditions = ("Taux préférentiel MCAP" | |
| 35 | + + (f" — en vigueur le {dm.group(1)}" if dm else "")) | |
| 36 | + return [self.make_product( | |
| 37 | + rate=prime, rate_type="other", term_months=12, kind="posted", | |
| 38 | + product_name="Taux préférentiel MCAP", purpose="unknown", | |
| 39 | + conditions=conditions, | |
| 40 | + raw={"prime": prime, "effective": dm.group(1) if dm else None})] | |
added
immoka/mortgage/providers/national_bank.py
+131 −0
@@ -0,0 +1,131 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/national_bank.py : Banque Nationale — JSON double-échappé | |
| 5 | +# setProductMap(JSON.parse("…")) dans la page des taux. c1 = produits | |
| 6 | +# hypothécaires (par productConditionName). ⚠️ Séparateurs décimaux mixtes : | |
| 7 | +# affichés « 6.090 » (point), promos « 4,84 » (virgule) — les tacNans sont | |
| 8 | +# les APR des promos. Le tauxBase du produit variable est un ÉCART, pas la | |
| 9 | +# prime : la prime vient du tauxBase du produit fixe. | |
| 10 | +# ----------------------------------------------------------------------------- | |
| 11 | +from __future__ import annotations | |
| 12 | + | |
| 13 | +import json | |
| 14 | +import re | |
| 15 | + | |
| 16 | +from .base import RateProvider | |
| 17 | + | |
| 18 | +PAGE_URL = "https://www.nbc.ca/personal/mortgages/rates.html" | |
| 19 | + | |
| 20 | +MAP_RX = re.compile(r'setProductMap\(JSON\.parse\("(.*?)"\)\)', re.S) | |
| 21 | + | |
| 22 | +# champs affichés fixes (fermés) -> terme mois ; taux1moisF exclu (< 3 mois) | |
| 23 | +FIXED_POSTED = { | |
| 24 | + "taux3moisF": 3, "taux6moisF": 6, "taux1anF": 12, "taux2ansF": 24, | |
| 25 | + "taux3ansF": 36, "taux4ansF": 48, "taux5ansF": 60, "taux6ansF": 72, | |
| 26 | + "taux7ansF": 84, "taux10ansF": 120, | |
| 27 | +} | |
| 28 | +FIXED_OPEN = {"taux6moisO": 6, "taux1anO": 12} | |
| 29 | +# promo -> (terme mois, champ APR) | |
| 30 | +FIXED_PROMO = { | |
| 31 | + "tauxPromo3ansF": (36, "tac3ans"), | |
| 32 | + "tauxPromo4ansF": (48, "tac4ans"), | |
| 33 | + "tauxPromo5ansF": (60, "tac5ans"), | |
| 34 | +} | |
| 35 | + | |
| 36 | + | |
| 37 | +def _num(v) -> float | None: | |
| 38 | + if v in (None, ""): | |
| 39 | + return None | |
| 40 | + try: | |
| 41 | + return float(str(v).replace("\xa0", "").replace(",", ".").strip()) | |
| 42 | + except ValueError: | |
| 43 | + return None | |
| 44 | + | |
| 45 | + | |
| 46 | +class NationalBankProvider(RateProvider): | |
| 47 | + provider_id = "national_bank" | |
| 48 | + institution = "Banque Nationale" | |
| 49 | + source_url = PAGE_URL | |
| 50 | + request_delay = 1.5 | |
| 51 | + | |
| 52 | + def fetch(self) -> list[dict]: | |
| 53 | + return self.parse(self.get(self.source_url).text) | |
| 54 | + | |
| 55 | + def parse(self, payload: str) -> list[dict]: | |
| 56 | + m = MAP_RX.search(payload) | |
| 57 | + if not m: | |
| 58 | + raise ValueError("setProductMap introuvable (structure changée)") | |
| 59 | + dec = (m.group(1).replace("\\x22", '"') | |
| 60 | + .replace("\\\\", "\\").replace("\\/", "/")) | |
| 61 | + # la chaîne JS se termine par «"), true);» : raw_decode ignore la suite | |
| 62 | + obj, _ = json.JSONDecoder().raw_decode(dec) | |
| 63 | + products = json.loads(obj.get("c1") or "[]") | |
| 64 | + by_name = {p.get("productConditionName"): p | |
| 65 | + for p in products if isinstance(p, dict)} | |
| 66 | + out: list[dict] = [] | |
| 67 | + fixed = by_name.get("Mortgage fixed rate") or {} | |
| 68 | + for field, term in FIXED_POSTED.items(): | |
| 69 | + rate = _num(fixed.get(field)) | |
| 70 | + if rate and rate > 0: | |
| 71 | + out.append(self.make_product( | |
| 72 | + rate=rate, rate_type="fixed", term_months=term, | |
| 73 | + kind="posted", | |
| 74 | + product_name=f"Fixe fermé {_label(term)}", | |
| 75 | + raw={"field": field, "value": fixed.get(field)})) | |
| 76 | + for field, term in FIXED_OPEN.items(): | |
| 77 | + rate = _num(fixed.get(field)) | |
| 78 | + if rate and rate > 0: | |
| 79 | + out.append(self.make_product( | |
| 80 | + rate=rate, rate_type="fixed", term_months=term, | |
| 81 | + kind="posted", | |
| 82 | + product_name=f"Fixe ouvert {_label(term)}", | |
| 83 | + raw={"field": field, "value": fixed.get(field)})) | |
| 84 | + for field, (term, apr_field) in FIXED_PROMO.items(): | |
| 85 | + rate = _num(fixed.get(field)) | |
| 86 | + if rate and rate > 0: | |
| 87 | + out.append(self.make_product( | |
| 88 | + rate=rate, rate_type="fixed", term_months=term, | |
| 89 | + kind="special", apr=_num(fixed.get(apr_field)), | |
| 90 | + product_name=f"Fixe fermé {_label(term)} (promotion)", | |
| 91 | + raw={"field": field, "value": fixed.get(field)})) | |
| 92 | + prime = _num(fixed.get("tauxBase")) | |
| 93 | + if prime and prime > 0: | |
| 94 | + out.append(self.make_product( | |
| 95 | + rate=prime, rate_type="other", term_months=12, kind="posted", | |
| 96 | + product_name="Taux préférentiel BNC", purpose="unknown", | |
| 97 | + raw={"field": "tauxBase", "value": fixed.get("tauxBase")})) | |
| 98 | + variable = by_name.get("Mortgage variable rate") or {} | |
| 99 | + v_posted = _num(variable.get("taux5ansO")) | |
| 100 | + if v_posted and v_posted > 0: | |
| 101 | + out.append(self.make_product( | |
| 102 | + rate=v_posted, rate_type="variable", term_months=60, | |
| 103 | + kind="posted", product_name="Variable 5 ans", | |
| 104 | + conditions="Base = taux préférentiel BNC", | |
| 105 | + raw={"field": "taux5ansO", "value": variable.get("taux5ansO")})) | |
| 106 | + v_promo = _num(variable.get("tauxPromo5ansF")) | |
| 107 | + if v_promo and v_promo > 0: | |
| 108 | + out.append(self.make_product( | |
| 109 | + rate=v_promo, rate_type="variable", term_months=60, | |
| 110 | + kind="special", apr=_num(variable.get("tac5ans")), | |
| 111 | + product_name="Variable 5 ans (promotion)", | |
| 112 | + raw={"field": "tauxPromo5ansF", | |
| 113 | + "value": variable.get("tauxPromo5ansF")})) | |
| 114 | + capped = by_name.get("Variable capped-rate mortgage") or {} | |
| 115 | + c_rate = _num(capped.get("taux5ansO")) | |
| 116 | + if c_rate and c_rate > 0: | |
| 117 | + cap = _num(capped.get("tauxPlafond")) | |
| 118 | + out.append(self.make_product( | |
| 119 | + rate=c_rate, rate_type="variable", term_months=60, | |
| 120 | + kind="posted", product_name="Variable plafonné 5 ans", | |
| 121 | + conditions=f"Taux plafond {cap} %" if cap else None, | |
| 122 | + raw={"field": "taux5ansO", "value": capped.get("taux5ansO"), | |
| 123 | + "tauxPlafond": capped.get("tauxPlafond")})) | |
| 124 | + return out | |
| 125 | + | |
| 126 | + | |
| 127 | +def _label(months: int) -> str: | |
| 128 | + if months < 12: | |
| 129 | + return f"{months} mois" | |
| 130 | + years = months // 12 | |
| 131 | + return f"{years} an" if years == 1 else f"{years} ans" | |
added
immoka/mortgage/providers/rbc.py
+112 −0
@@ -0,0 +1,112 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/rbc.py : RBC — API JSON publique publicrates (celle que | |
| 5 | +# consomme leur propre page de taux, 1 requête par code de taux). | |
| 6 | +# ⚠️ Les produits variables sont publiés en ÉCART vs prime (ex. -0.500) : | |
| 7 | +# reconstitués avec le code prime, jamais interprétés comme des taux. | |
| 8 | +# ----------------------------------------------------------------------------- | |
| 9 | +from __future__ import annotations | |
| 10 | + | |
| 11 | +import json | |
| 12 | + | |
| 13 | +from .base import RateProvider | |
| 14 | + | |
| 15 | +API = ("https://apps.royalbank.com/apps/app-services/public-rates/api/" | |
| 16 | + "publicrates?code={code}") | |
| 17 | +PAGE_URL = "https://www.rbcroyalbank.com/mortgages/mortgage-rates.html" | |
| 18 | + | |
| 19 | +PRIME_CODE = "0006470002" | |
| 20 | + | |
| 21 | +# code -> (rate_type, terme mois, kind, insured_status, nom, code APR|None) | |
| 22 | +CODE_MAP: dict[str, tuple] = { | |
| 23 | + "0006340010": ("fixed", 6, "posted", "unknown", "Fixe 6 mois convertible", None), | |
| 24 | + "0006340013": ("fixed", 12, "posted", "unknown", "Fixe fermé 1 an", None), | |
| 25 | + "0006340016": ("fixed", 24, "posted", "unknown", "Fixe fermé 2 ans", None), | |
| 26 | + "0006340019": ("fixed", 36, "posted", "unknown", "Fixe fermé 3 ans", None), | |
| 27 | + "0006340022": ("fixed", 48, "posted", "unknown", "Fixe fermé 4 ans", None), | |
| 28 | + "0006340025": ("fixed", 60, "posted", "unknown", "Fixe fermé 5 ans", None), | |
| 29 | + "0006340042": ("fixed", 84, "posted", "unknown", "Fixe fermé 7 ans", None), | |
| 30 | + "0006340030": ("fixed", 120, "posted", "unknown", "Fixe fermé 10 ans", None), | |
| 31 | + "0386080056": ("fixed", 12, "special", "unknown", "Fixe fermé 1 an (offre spéciale)", "0386140074"), | |
| 32 | + "0386080057": ("fixed", 24, "special", "unknown", "Fixe fermé 2 ans (offre spéciale)", "0386140075"), | |
| 33 | + "0386080058": ("fixed", 36, "special", "unknown", "Fixe fermé 3 ans (offre spéciale)", "0386140076"), | |
| 34 | + "0386080059": ("fixed", 48, "special", "unknown", "Fixe fermé 4 ans (offre spéciale)", "0386140077"), | |
| 35 | + "0386080060": ("fixed", 60, "special", "unknown", "Fixe fermé 5 ans (offre spéciale)", "0386140078"), | |
| 36 | + "0386080061": ("fixed", 84, "special", "unknown", "Fixe fermé 7 ans (offre spéciale)", "0386140079"), | |
| 37 | + "0385940006": ("fixed", 60, "special", "insured", "Fixe fermé 5 ans (ratio élevé)", "0386090006"), | |
| 38 | +} | |
| 39 | +# codes variables : ÉCART vs prime -> taux = prime + valeur | |
| 40 | +SPREAD_MAP: dict[str, tuple] = { | |
| 41 | + "0236440012": ("variable", 60, "posted", "unknown", "Variable fermé 5 ans", "0166950009"), | |
| 42 | + "0386080070": ("variable", 60, "special", "unknown", "Variable fermé 5 ans (offre spéciale)", "0386140088"), | |
| 43 | + "0385940016": ("variable", 60, "special", "insured", "Variable fermé 5 ans (ratio élevé)", "0386090016"), | |
| 44 | +} | |
| 45 | + | |
| 46 | + | |
| 47 | +def _value(responses: dict, code: str) -> float | None: | |
| 48 | + resp = responses.get(code) | |
| 49 | + if not isinstance(resp, dict): | |
| 50 | + return None | |
| 51 | + content = resp.get("result_content") or {} | |
| 52 | + try: | |
| 53 | + return float(content.get("Value")) | |
| 54 | + except (TypeError, ValueError): | |
| 55 | + return None | |
| 56 | + | |
| 57 | + | |
| 58 | +class RbcProvider(RateProvider): | |
| 59 | + provider_id = "rbc" | |
| 60 | + institution = "RBC Banque Royale" | |
| 61 | + source_url = PAGE_URL | |
| 62 | + request_delay = 0.6 | |
| 63 | + | |
| 64 | + def _codes(self) -> list[str]: | |
| 65 | + codes = [PRIME_CODE] + list(CODE_MAP) + list(SPREAD_MAP) | |
| 66 | + codes += [apr for *_, apr in CODE_MAP.values() if apr] | |
| 67 | + codes += [apr for *_, apr in SPREAD_MAP.values() if apr] | |
| 68 | + return codes | |
| 69 | + | |
| 70 | + def fetch(self) -> list[dict]: | |
| 71 | + responses: dict[str, dict] = {} | |
| 72 | + for code in self._codes(): | |
| 73 | + try: | |
| 74 | + responses[code] = json.loads(self.get(API.format(code=code)).text) | |
| 75 | + except Exception: # noqa: BLE001 — un code raté n'annule pas le reste | |
| 76 | + continue | |
| 77 | + return self.parse_codes(responses) | |
| 78 | + | |
| 79 | + def parse(self, payload: str) -> list[dict]: | |
| 80 | + """Pour les tests fixtures : payload = JSON {code: réponse API}.""" | |
| 81 | + data = json.loads(payload) | |
| 82 | + return self.parse_codes(data.get("responses") or data) | |
| 83 | + | |
| 84 | + def parse_codes(self, responses: dict) -> list[dict]: | |
| 85 | + out: list[dict] = [] | |
| 86 | + prime = _value(responses, PRIME_CODE) | |
| 87 | + for code, (rtype, term, kind, insured, name, apr_code) in CODE_MAP.items(): | |
| 88 | + rate = _value(responses, code) | |
| 89 | + if rate is None or rate <= 0: | |
| 90 | + continue | |
| 91 | + apr = _value(responses, apr_code) if apr_code else None | |
| 92 | + out.append(self.make_product( | |
| 93 | + rate=rate, rate_type=rtype, term_months=term, kind=kind, | |
| 94 | + product_name=name, apr=apr, insured_status=insured, | |
| 95 | + raw={"code": code, "value": rate})) | |
| 96 | + if prime is not None: | |
| 97 | + for code, (rtype, term, kind, insured, name, apr_code) in SPREAD_MAP.items(): | |
| 98 | + spread = _value(responses, code) | |
| 99 | + if spread is None or abs(spread) > 3: | |
| 100 | + continue # un écart vs prime > 3 pts : structure changée | |
| 101 | + apr = _value(responses, apr_code) if apr_code else None | |
| 102 | + out.append(self.make_product( | |
| 103 | + rate=round(prime + spread, 3), rate_type=rtype, | |
| 104 | + term_months=term, kind=kind, product_name=name, apr=apr, | |
| 105 | + insured_status=insured, | |
| 106 | + conditions=f"Prime RBC {prime} % {spread:+} pt", | |
| 107 | + raw={"code": code, "spread": spread, "prime": prime})) | |
| 108 | + out.append(self.make_product( | |
| 109 | + rate=prime, rate_type="other", term_months=12, kind="posted", | |
| 110 | + product_name="Taux préférentiel RBC", purpose="unknown", | |
| 111 | + raw={"code": PRIME_CODE, "value": prime})) | |
| 112 | + return out | |
added
immoka/mortgage/providers/scotiabank.py
+104 −0
@@ -0,0 +1,104 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/scotiabank.py : Banque Scotia — API JSON publique | |
| 5 | +# dmtsms.scotiabank.com (celle que consomme leur propre page de taux). | |
| 6 | +# nonspecialmortgage = taux affichés ; varmortgage = slots promotionnels | |
| 7 | +# (le mapping slot -> produit vient de la page ; on ne garde que les slots | |
| 8 | +# dont l'identité est connue, avec confiance réduite). | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import json | |
| 13 | + | |
| 14 | +from .base import RateProvider | |
| 15 | + | |
| 16 | +POSTED_URL = "https://dmtsms.scotiabank.com/api/rates/daily/nonspecialmortgage" | |
| 17 | +PROMO_URL = "https://dmtsms.scotiabank.com/api/rates/daily/varmortgage" | |
| 18 | +PAGE_URL = ("https://www.scotiabank.com/ca/en/personal/rates-prices/" | |
| 19 | + "mortgages-rates.html") | |
| 20 | + | |
| 21 | +# PRODUCT -> (rate_type, insured_status, nom, purpose) | |
| 22 | +POSTED_MAP = { | |
| 23 | + "N.H.A. RESIDENTIAL, ETC": ("fixed", "insured", "Fixe affiché (assuré LNH)"), | |
| 24 | + "CONVENTIONAL RESIDENTIAL, ETC": ("fixed", "uninsured", "Fixe affiché (conventionnel)"), | |
| 25 | + "ULTIMATE VARIABLE RATE": ("variable", "unknown", "Ultimate Variable"), | |
| 26 | + "OPEN": ("fixed", "unknown", "Fixe ouvert"), | |
| 27 | + "FLEXIBLE": ("fixed", "unknown", "Flexible"), | |
| 28 | +} | |
| 29 | + | |
| 30 | +# Slots promotionnels dont l'identité est documentée sur la page Scotia | |
| 31 | +# (2026-08). Confiance réduite : si Scotia réordonne ses slots, la validation | |
| 32 | +# et la comparaison croisée limitent les dégâts. | |
| 33 | +PROMO_SLOTS = { | |
| 34 | + "MORTGAGE PROMOTIONAL 1": ("variable", 60, "Flex Value fermé 5 ans (variable)"), | |
| 35 | + "MORTGAGE PROMOTIONAL 2": ("variable", 36, "Ultimate Variable 3 ans"), | |
| 36 | + "MORTGAGE PROMOTIONAL 3": ("variable", 60, "Flex Value ouvert 5 ans (variable)"), | |
| 37 | +} | |
| 38 | + | |
| 39 | + | |
| 40 | +def _term_months(t: dict) -> int | None: | |
| 41 | + try: | |
| 42 | + v = int(t["TERM_VALUE"]) | |
| 43 | + except (KeyError, ValueError, TypeError): | |
| 44 | + return None | |
| 45 | + unit = (t.get("TERM_UNIT") or "").upper() | |
| 46 | + if unit == "Y": | |
| 47 | + return v * 12 | |
| 48 | + if unit == "M": | |
| 49 | + return v | |
| 50 | + return None | |
| 51 | + | |
| 52 | + | |
| 53 | +class ScotiabankProvider(RateProvider): | |
| 54 | + provider_id = "scotiabank" | |
| 55 | + institution = "Banque Scotia" | |
| 56 | + source_url = PAGE_URL | |
| 57 | + request_delay = 1.0 | |
| 58 | + | |
| 59 | + def fetch(self) -> list[dict]: | |
| 60 | + posted = self.get(POSTED_URL).text | |
| 61 | + try: | |
| 62 | + promo = self.get(PROMO_URL).text | |
| 63 | + except Exception: # noqa: BLE001 — promos facultatives | |
| 64 | + promo = "" | |
| 65 | + return self.parse(posted) + (self.parse_promos(promo) if promo else []) | |
| 66 | + | |
| 67 | + def parse(self, payload: str) -> list[dict]: | |
| 68 | + data = json.loads(payload) | |
| 69 | + out: list[dict] = [] | |
| 70 | + for prod in data.get("data") or []: | |
| 71 | + name = (prod.get("PRODUCT") or "").strip() | |
| 72 | + if name not in POSTED_MAP: | |
| 73 | + continue # produits chalet/cap/right-rate : hors périmètre | |
| 74 | + rtype, insured, label = POSTED_MAP[name] | |
| 75 | + for t in prod.get("TERMS") or []: | |
| 76 | + term = _term_months(t) | |
| 77 | + rate = t.get("RATE") | |
| 78 | + if term is None or not isinstance(rate, (int, float)) or rate <= 0: | |
| 79 | + continue | |
| 80 | + out.append(self.make_product( | |
| 81 | + rate=float(rate), rate_type=rtype, term_months=term, | |
| 82 | + kind="posted", product_name=label, | |
| 83 | + insured_status=insured, | |
| 84 | + conditions=name, | |
| 85 | + raw={"product": name, "term": t})) | |
| 86 | + return out | |
| 87 | + | |
| 88 | + def parse_promos(self, payload: str) -> list[dict]: | |
| 89 | + data = json.loads(payload) | |
| 90 | + out: list[dict] = [] | |
| 91 | + for prod in data.get("data") or []: | |
| 92 | + name = (prod.get("PRODUCT") or "").strip() | |
| 93 | + if name not in PROMO_SLOTS: | |
| 94 | + continue | |
| 95 | + rate = prod.get("RATE") | |
| 96 | + if not isinstance(rate, (int, float)) or rate <= 0: | |
| 97 | + continue # slot inutilisé | |
| 98 | + rtype, term, label = PROMO_SLOTS[name] | |
| 99 | + out.append(self.make_product( | |
| 100 | + rate=float(rate), rate_type=rtype, term_months=term, | |
| 101 | + kind="special", product_name=label, confidence=0.8, | |
| 102 | + conditions=f"Slot promotionnel Scotia ({name})", | |
| 103 | + raw={"product": name, "rate": rate})) | |
| 104 | + return out | |
added
immoka/mortgage/providers/tangerine.py
+55 −0
@@ -0,0 +1,55 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/tangerine.py : Tangerine — JSON statique publié | |
| 5 | +# (currentRates.json, le fichier que charge leur page /rates). Un seul taux | |
| 6 | +# par terme (pas de distinction affiché/spécial chez Tangerine) : kind | |
| 7 | +# "special" car c'est leur taux client réel. | |
| 8 | +# ----------------------------------------------------------------------------- | |
| 9 | +from __future__ import annotations | |
| 10 | + | |
| 11 | +import json | |
| 12 | + | |
| 13 | +from .base import RateProvider, parse_rate | |
| 14 | + | |
| 15 | +RATES_URL = ("https://www.tangerine.ca/content/dam/tangerine-shared/" | |
| 16 | + "product-rates/currentRates.json") | |
| 17 | + | |
| 18 | + | |
| 19 | +class TangerineProvider(RateProvider): | |
| 20 | + provider_id = "tangerine" | |
| 21 | + institution = "Tangerine" | |
| 22 | + source_url = "https://www.tangerine.ca/en/rates" | |
| 23 | + request_delay = 1.0 | |
| 24 | + | |
| 25 | + def fetch(self) -> list[dict]: | |
| 26 | + return self.parse(self.get(RATES_URL).text) | |
| 27 | + | |
| 28 | + def parse(self, payload: str) -> list[dict]: | |
| 29 | + data = json.loads(payload) | |
| 30 | + out: list[dict] = [] | |
| 31 | + for r in data.get("rates") or []: | |
| 32 | + if r.get("group") != "mortgage": | |
| 33 | + continue | |
| 34 | + code = r.get("max_product_code") | |
| 35 | + rate = r.get("interest_rate") | |
| 36 | + term_years = r.get("term") | |
| 37 | + if not isinstance(rate, (int, float)) or rate <= 0: | |
| 38 | + continue | |
| 39 | + if not isinstance(term_years, (int, float)) or term_years <= 0: | |
| 40 | + continue | |
| 41 | + if code == "Mortgage": | |
| 42 | + rtype, label = "fixed", f"Fixe {int(term_years)} an(s)" | |
| 43 | + elif code == "VarMortgage": | |
| 44 | + rtype, label = "variable", f"Variable {int(term_years)} an(s)" | |
| 45 | + else: | |
| 46 | + continue # preferred_* et autres : clients connectés, ignorés | |
| 47 | + apr = parse_rate(r.get("apr_value_en") or "") | |
| 48 | + out.append(self.make_product( | |
| 49 | + rate=float(rate), rate_type=rtype, | |
| 50 | + term_months=int(term_years * 12), kind="special", | |
| 51 | + product_name=label, apr=apr, | |
| 52 | + conditions=f"Taux unique Tangerine (en date du {r.get('date')})", | |
| 53 | + raw={"account_term": r.get("account_term"), | |
| 54 | + "date": r.get("date"), "interest_rate": rate})) | |
| 55 | + return out | |
added
immoka/mortgage/providers/td.py
+115 −0
@@ -0,0 +1,115 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/providers/td.py : TD Canada Trust — API JSON publique getRates | |
| 5 | +# (POST ratesType=resl, celle que consomme leur page de taux). Chaque code | |
| 6 | +# MTG{F|V}{mois}{C|O} porte deux tableaux highRatio / nonHighRatio de la | |
| 7 | +# forme [affiché, escompte, spécial, APR, drapeau]. Le « affiché » des | |
| 8 | +# produits variables est le TD Mortgage Prime. ⚠️ Pour les termes sans offre | |
| 9 | +# spéciale réelle, TD publie un « spécial » reconstruit (escompte négatif) | |
| 10 | +# dont l'APR correspond en fait au taux AFFICHÉ : ces lignes incohérentes | |
| 11 | +# (APR < spécial) sont écartées — jamais interprétées. | |
| 12 | +# ----------------------------------------------------------------------------- | |
| 13 | +from __future__ import annotations | |
| 14 | + | |
| 15 | +import json | |
| 16 | +import re | |
| 17 | + | |
| 18 | +from .base import RateProvider | |
| 19 | + | |
| 20 | +API_URL = "https://psservice.td.com/ca/en/carate/getRates" | |
| 21 | +PAGE_URL = ("https://www.td.com/ca/en/personal-banking/products/mortgages/" | |
| 22 | + "mortgage-rates") | |
| 23 | + | |
| 24 | +CODE_RX = re.compile(r"^MTG([FV])(\d{3})([CO])$") | |
| 25 | + | |
| 26 | +IDX_POSTED, IDX_SPECIAL, IDX_APR = 0, 2, 3 | |
| 27 | + | |
| 28 | + | |
| 29 | +def _num(v) -> float | None: | |
| 30 | + try: | |
| 31 | + return float(str(v).strip()) | |
| 32 | + except (TypeError, ValueError): | |
| 33 | + return None | |
| 34 | + | |
| 35 | + | |
| 36 | +def _label(months: int) -> str: | |
| 37 | + if months < 12: | |
| 38 | + return f"{months} mois" | |
| 39 | + years = months // 12 | |
| 40 | + return f"{years} an" if years == 1 else f"{years} ans" | |
| 41 | + | |
| 42 | + | |
| 43 | +class TdProvider(RateProvider): | |
| 44 | + provider_id = "td" | |
| 45 | + institution = "TD Canada Trust" | |
| 46 | + source_url = PAGE_URL | |
| 47 | + request_delay = 1.0 | |
| 48 | + | |
| 49 | + def fetch(self) -> list[dict]: | |
| 50 | + wait_kw = {"timeout": self.timeout, | |
| 51 | + "headers": {"Content-Type": "application/json"}} | |
| 52 | + resp = self.session.post(API_URL, json={"ratesType": "resl"}, **wait_kw) | |
| 53 | + resp.raise_for_status() | |
| 54 | + return self.parse(resp.text) | |
| 55 | + | |
| 56 | + def parse(self, payload: str) -> list[dict]: | |
| 57 | + data = json.loads(payload) | |
| 58 | + if not isinstance(data, dict): | |
| 59 | + raise ValueError("réponse TD inattendue (structure changée)") | |
| 60 | + for wrapper in ("rates", "data", "result"): | |
| 61 | + if wrapper in data and isinstance(data[wrapper], dict): | |
| 62 | + data = data[wrapper] | |
| 63 | + break | |
| 64 | + out: list[dict] = [] | |
| 65 | + prime: float | None = None | |
| 66 | + for code, tables in data.items(): | |
| 67 | + m = CODE_RX.match(str(code)) | |
| 68 | + if not m or not isinstance(tables, dict): | |
| 69 | + continue # FLT* (FlexLine/HELOC) et codes inconnus : ignorés | |
| 70 | + rtype = "fixed" if m.group(1) == "F" else "variable" | |
| 71 | + term = int(m.group(2)) | |
| 72 | + openness = "fermé" if m.group(3) == "C" else "ouvert" | |
| 73 | + base = ("Fixe" if rtype == "fixed" else "Variable") | |
| 74 | + non_hr = tables.get("nonHighRatio") or [] | |
| 75 | + high_r = tables.get("highRatio") or [] | |
| 76 | + posted = _num(non_hr[IDX_POSTED]) if len(non_hr) > IDX_POSTED else None | |
| 77 | + if posted and posted > 0: | |
| 78 | + if rtype == "variable": | |
| 79 | + # l'« affiché » des codes MTGV est le TD Mortgage Prime, | |
| 80 | + # pas le taux du produit : jamais émis comme taux variable | |
| 81 | + prime = posted | |
| 82 | + else: | |
| 83 | + out.append(self.make_product( | |
| 84 | + rate=posted, rate_type=rtype, term_months=term, | |
| 85 | + kind="posted", | |
| 86 | + product_name=f"{base} {openness} {_label(term)}", | |
| 87 | + raw={"code": code, "row": non_hr})) | |
| 88 | + for arr, insured, suffix in ((non_hr, "uninsured", ""), | |
| 89 | + (high_r, "insured", ", ratio élevé")): | |
| 90 | + if len(arr) <= IDX_APR: | |
| 91 | + continue | |
| 92 | + special = _num(arr[IDX_SPECIAL]) | |
| 93 | + if special is None or special <= 0: | |
| 94 | + continue | |
| 95 | + if posted is not None and special == posted and rtype == "fixed" \ | |
| 96 | + and _num(arr[1]) in (0, None): | |
| 97 | + continue # pas de spécial publié pour ce produit | |
| 98 | + apr = _num(arr[IDX_APR]) | |
| 99 | + if apr is not None and apr < special - 0.02: | |
| 100 | + continue # « spécial » reconstruit : APR = celui du taux affiché | |
| 101 | + out.append(self.make_product( | |
| 102 | + rate=special, rate_type=rtype, term_months=term, | |
| 103 | + kind="special", apr=apr, | |
| 104 | + product_name=f"{base} {openness} {_label(term)} " | |
| 105 | + f"(offre spéciale{suffix})", | |
| 106 | + insured_status=insured, | |
| 107 | + conditions="Base = TD Mortgage Prime" | |
| 108 | + if rtype == "variable" else None, | |
| 109 | + raw={"code": code, "row": arr})) | |
| 110 | + if prime and prime > 0: | |
| 111 | + out.append(self.make_product( | |
| 112 | + rate=prime, rate_type="other", term_months=12, kind="posted", | |
| 113 | + product_name="TD Mortgage Prime", purpose="unknown", | |
| 114 | + raw={"field": "MTGV*[0]", "value": prime})) | |
| 115 | + return out | |
added
immoka/mortgage/scheduler.py
+120 −0
@@ -0,0 +1,120 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/scheduler.py : orchestration de la collecte des taux. | |
| 5 | +# Pipeline : provider.fetch() -> validation -> enregistrement historisé. | |
| 6 | +# Retries avec backoff exponentiel, timeout par provider, logs structurés, | |
| 7 | +# santé par provider (provider_runs). Une panne d'un provider n'affecte | |
| 8 | +# jamais les autres ni le calculateur (dernière donnée valide conservée). | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import os | |
| 13 | +import time | |
| 14 | +import traceback | |
| 15 | + | |
| 16 | +import requests | |
| 17 | + | |
| 18 | +from . import store | |
| 19 | +from .providers import PROVIDERS | |
| 20 | +from .validate import validate_batch | |
| 21 | + | |
| 22 | +RETRIES = int(os.environ.get("IMMOKA_MORTGAGE_RETRIES", "3")) | |
| 23 | +BACKOFF_BASE_S = float(os.environ.get("IMMOKA_MORTGAGE_BACKOFF", "5")) | |
| 24 | +# Fréquence de collecte (minutes) — utilisée par watch() ci-dessous. | |
| 25 | +INTERVAL_MIN = int(os.environ.get("IMMOKA_MORTGAGE_INTERVAL_MIN", "180")) | |
| 26 | + | |
| 27 | + | |
| 28 | +def _log(**kw) -> None: | |
| 29 | + print("[mortgage] " + " ".join(f"{k}={v}" for k, v in kw.items()), | |
| 30 | + flush=True) | |
| 31 | + | |
| 32 | + | |
| 33 | +def run_provider(slug: str, con=None) -> dict: | |
| 34 | + """Collecte UNE institution avec retries + backoff. Retourne le résumé.""" | |
| 35 | + if con is None: | |
| 36 | + con = store.connect() | |
| 37 | + cls = PROVIDERS[slug] | |
| 38 | + t0 = time.time() | |
| 39 | + products: list[dict] | None = None | |
| 40 | + status, message = "success", "" | |
| 41 | + for attempt in range(RETRIES): | |
| 42 | + try: | |
| 43 | + products = cls().fetch() | |
| 44 | + break | |
| 45 | + except requests.RequestException as exc: | |
| 46 | + status, message = "http_error", str(exc)[:200] | |
| 47 | + except Exception as exc: # noqa: BLE001 — parseur cassé, etc. | |
| 48 | + status, message = "parser_error", str(exc)[:200] | |
| 49 | + traceback.print_exc() | |
| 50 | + if attempt < RETRIES - 1: | |
| 51 | + time.sleep(BACKOFF_BASE_S * (2 ** attempt)) | |
| 52 | + duration_ms = int((time.time() - t0) * 1000) | |
| 53 | + if products is None: | |
| 54 | + store.log_run(con, slug, ok=False, status=status, | |
| 55 | + duration_ms=duration_ms, message=message) | |
| 56 | + _log(provider=slug, status=status, duration=f"{duration_ms}ms", | |
| 57 | + message=message or "-") | |
| 58 | + return {"provider": slug, "ok": False, "status": status, | |
| 59 | + "message": message} | |
| 60 | + valid, problems = validate_batch(products) | |
| 61 | + if not valid: | |
| 62 | + status = "empty" if not products else "validation_error" | |
| 63 | + store.log_run(con, slug, ok=False, status=status, | |
| 64 | + products=len(products), rejected=len(problems), | |
| 65 | + duration_ms=duration_ms, | |
| 66 | + message="; ".join(problems[:5])) | |
| 67 | + _log(provider=slug, status=status, products=len(products), | |
| 68 | + rejected=len(problems), duration=f"{duration_ms}ms") | |
| 69 | + return {"provider": slug, "ok": False, "status": status, | |
| 70 | + "problems": problems} | |
| 71 | + res = store.record_observations(con, slug, valid) | |
| 72 | + ok = True | |
| 73 | + if problems or res["rejected"]: | |
| 74 | + status = "success" # partiel : données saines enregistrées quand même | |
| 75 | + store.log_run(con, slug, ok=ok, status=status, products=len(valid), | |
| 76 | + changed=res["changed"], | |
| 77 | + rejected=len(problems) + res["rejected"], | |
| 78 | + duration_ms=duration_ms, | |
| 79 | + message="; ".join((problems + res["rejected_details"])[:5])) | |
| 80 | + _log(provider=slug, status=status, products=len(valid), | |
| 81 | + changed=res["changed"], rejected=len(problems) + res["rejected"], | |
| 82 | + duration=f"{duration_ms}ms") | |
| 83 | + return {"provider": slug, "ok": True, "status": status, | |
| 84 | + "products": len(valid), "changed": res["changed"], | |
| 85 | + "rejected": len(problems) + res["rejected"]} | |
| 86 | + | |
| 87 | + | |
| 88 | +def run(only: list[str] | None = None) -> list[dict]: | |
| 89 | + """Collecte toutes les institutions (ou celles listées). Séquentiel et | |
| 90 | + poli — jamais de martèlement des sites bancaires.""" | |
| 91 | + con = store.connect() | |
| 92 | + slugs = [s for s in sorted(PROVIDERS) if not only or s in only] | |
| 93 | + results = [run_provider(s, con) for s in slugs] | |
| 94 | + ok = sum(1 for r in results if r["ok"]) | |
| 95 | + _log(status="done", providers=len(results), ok=ok, | |
| 96 | + failed=len(results) - ok) | |
| 97 | + return results | |
| 98 | + | |
| 99 | + | |
| 100 | +def watch(interval_minutes: int | None = None) -> None: | |
| 101 | + """Boucle autonome de collecte (défaut : IMMOKA_MORTGAGE_INTERVAL_MIN).""" | |
| 102 | + minutes = interval_minutes or INTERVAL_MIN | |
| 103 | + while True: | |
| 104 | + try: | |
| 105 | + run() | |
| 106 | + except Exception: # noqa: BLE001 — la boucle ne meurt jamais | |
| 107 | + traceback.print_exc() | |
| 108 | + time.sleep(minutes * 60) | |
| 109 | + | |
| 110 | + | |
| 111 | +def maybe_run(min_age_minutes: int | None = None) -> None: | |
| 112 | + """Collecte seulement si la dernière passe date de plus de | |
| 113 | + `min_age_minutes` — appelé depuis la boucle watch d'ingest.py sans risque | |
| 114 | + de sur-solliciter les banques.""" | |
| 115 | + age_min = min_age_minutes or INTERVAL_MIN | |
| 116 | + con = store.connect() | |
| 117 | + last = con.execute("SELECT MAX(ts) AS m FROM provider_runs").fetchone() | |
| 118 | + if last and last["m"] and (time.time() - last["m"]) < age_min * 60: | |
| 119 | + return | |
| 120 | + run() | |
added
immoka/mortgage/store.py
+336 −0
@@ -0,0 +1,336 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/store.py : persistance des taux hypothécaires (data/mortgage.db). | |
| 5 | +# Historisation par périodes de validité : une ligne « courante » par produit | |
| 6 | +# (valid_to IS NULL) ; un changement de taux ferme la ligne et en ouvre une | |
| 7 | +# nouvelle. Aucune donnée n'est jamais écrasée — l'historique complet se | |
| 8 | +# reconstruit par produit. Santé des providers dans provider_runs. | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +import hashlib | |
| 13 | +import json | |
| 14 | +import sqlite3 | |
| 15 | +import statistics | |
| 16 | +import time | |
| 17 | +from pathlib import Path | |
| 18 | + | |
| 19 | +DB_PATH = Path(__file__).resolve().parent.parent.parent / "data" / "mortgage.db" | |
| 20 | + | |
| 21 | +# Un taux « courant » plus vieux que STALE_H heures est signalé périmé. | |
| 22 | +STALE_H = 24 | |
| 23 | +# Rejet des sauts aberrants : variation > JUMP_MAX points en < JUMP_WINDOW_H h. | |
| 24 | +JUMP_MAX = 2.5 | |
| 25 | +JUMP_WINDOW_H = 48 | |
| 26 | + | |
| 27 | +_SCHEMA = """ | |
| 28 | +CREATE TABLE IF NOT EXISTS rate_observations ( | |
| 29 | + id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| 30 | + provider TEXT NOT NULL, | |
| 31 | + institution TEXT NOT NULL, | |
| 32 | + product_key TEXT NOT NULL, -- empreinte identité produit | |
| 33 | + product_name TEXT, | |
| 34 | + rate_type TEXT NOT NULL, -- fixed|variable|adjustable|other | |
| 35 | + term_months INTEGER NOT NULL, | |
| 36 | + kind TEXT NOT NULL, -- posted|special | |
| 37 | + rate REAL NOT NULL, -- taux contractuel en % (ex. 4.19) | |
| 38 | + apr REAL, | |
| 39 | + insured_status TEXT DEFAULT 'unknown', -- insured|insurable|uninsured|unknown | |
| 40 | + purpose TEXT DEFAULT 'purchase', -- purchase|renewal|refinance|unknown | |
| 41 | + amortization_max_years INTEGER, | |
| 42 | + conditions TEXT, | |
| 43 | + source_url TEXT, | |
| 44 | + confidence REAL DEFAULT 1.0, | |
| 45 | + raw TEXT, -- JSON : observation brute (audit) | |
| 46 | + valid_from REAL NOT NULL, | |
| 47 | + valid_to REAL, -- NULL = taux courant | |
| 48 | + last_checked REAL NOT NULL | |
| 49 | +); | |
| 50 | +CREATE INDEX IF NOT EXISTS idx_rateobs_current | |
| 51 | + ON rate_observations(provider, product_key, valid_to); | |
| 52 | +CREATE INDEX IF NOT EXISTS idx_rateobs_lookup | |
| 53 | + ON rate_observations(rate_type, term_months, valid_to); | |
| 54 | + | |
| 55 | +CREATE TABLE IF NOT EXISTS provider_runs ( | |
| 56 | + id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| 57 | + provider TEXT NOT NULL, | |
| 58 | + ts REAL NOT NULL, | |
| 59 | + ok INTEGER, | |
| 60 | + status TEXT, -- success|http_error|parser_error|validation_error|empty | |
| 61 | + products INTEGER, | |
| 62 | + changed INTEGER, | |
| 63 | + rejected INTEGER, | |
| 64 | + duration_ms INTEGER, | |
| 65 | + message TEXT | |
| 66 | +); | |
| 67 | +CREATE INDEX IF NOT EXISTS idx_provider_runs ON provider_runs(provider, ts); | |
| 68 | + | |
| 69 | +-- Préparé pour les notifications futures (« alerte-moi si le 5 ans fixe | |
| 70 | +-- passe sous 3,99 % » / « si le paiement de cette propriété passe sous X $ »). | |
| 71 | +CREATE TABLE IF NOT EXISTS rate_alerts ( | |
| 72 | + id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| 73 | + created REAL NOT NULL, | |
| 74 | + kind TEXT NOT NULL, -- rate_below|payment_below | |
| 75 | + params TEXT, -- JSON : {rate_type, term_months, uid, down…} | |
| 76 | + threshold REAL NOT NULL, | |
| 77 | + contact TEXT, | |
| 78 | + active INTEGER DEFAULT 1, | |
| 79 | + fired_at REAL | |
| 80 | +); | |
| 81 | +""" | |
| 82 | + | |
| 83 | +_SCHEMA_READY = False | |
| 84 | + | |
| 85 | + | |
| 86 | +def connect() -> sqlite3.Connection: | |
| 87 | + global _SCHEMA_READY | |
| 88 | + DB_PATH.parent.mkdir(parents=True, exist_ok=True) | |
| 89 | + con = sqlite3.connect(DB_PATH, timeout=60) | |
| 90 | + con.row_factory = sqlite3.Row | |
| 91 | + con.execute("PRAGMA journal_mode=WAL") | |
| 92 | + con.execute("PRAGMA synchronous=NORMAL") | |
| 93 | + con.execute("PRAGMA busy_timeout=120000") | |
| 94 | + if not _SCHEMA_READY: | |
| 95 | + con.executescript(_SCHEMA) | |
| 96 | + con.commit() | |
| 97 | + _SCHEMA_READY = True | |
| 98 | + return con | |
| 99 | + | |
| 100 | + | |
| 101 | +def product_key(p: dict) -> str: | |
| 102 | + """Identité stable d'un produit : institution + type + terme + nature du | |
| 103 | + taux + assurabilité + objet + nom. Deux produits incompatibles ne | |
| 104 | + partagent jamais la même clé (règle : ne jamais comparer l'incomparable).""" | |
| 105 | + ident = "|".join([ | |
| 106 | + p["provider"], p["rate_type"], str(p["term_months"]), p["kind"], | |
| 107 | + p.get("insured_status") or "unknown", p.get("purpose") or "purchase", | |
| 108 | + (p.get("product_name") or "").strip().lower(), | |
| 109 | + ]) | |
| 110 | + return hashlib.sha1(ident.encode()).hexdigest()[:16] | |
| 111 | + | |
| 112 | + | |
| 113 | +def record_observations(con: sqlite3.Connection, provider: str, | |
| 114 | + products: list[dict]) -> dict: | |
| 115 | + """Enregistre une passe de collecte validée. | |
| 116 | + | |
| 117 | + Pour chaque produit : si le taux courant est identique → simple mise à | |
| 118 | + jour de last_checked ; s'il a changé → fermeture de la période et | |
| 119 | + insertion d'une nouvelle ligne. Rejette les sauts aberrants (> JUMP_MAX | |
| 120 | + points en < JUMP_WINDOW_H h) sans écraser la bonne donnée précédente. | |
| 121 | + Retourne {seen, changed, rejected, rejected_details}.""" | |
| 122 | + now = time.time() | |
| 123 | + changed = 0 | |
| 124 | + rejected: list[str] = [] | |
| 125 | + for p in products: | |
| 126 | + pk = product_key(p) | |
| 127 | + cur = con.execute( | |
| 128 | + "SELECT id, rate, last_checked FROM rate_observations " | |
| 129 | + "WHERE provider=? AND product_key=? AND valid_to IS NULL", | |
| 130 | + (provider, pk)).fetchone() | |
| 131 | + if cur is not None: | |
| 132 | + if abs(cur["rate"] - p["rate"]) < 1e-9: | |
| 133 | + con.execute( | |
| 134 | + "UPDATE rate_observations SET last_checked=?, apr=?, " | |
| 135 | + "conditions=?, source_url=? WHERE id=?", | |
| 136 | + (now, p.get("apr"), p.get("conditions"), | |
| 137 | + p.get("source_url"), cur["id"])) | |
| 138 | + continue | |
| 139 | + # Garde-fou anti-aberration : ne jamais écraser une donnée saine | |
| 140 | + # par un saut manifestement impossible. | |
| 141 | + age_h = (now - (cur["last_checked"] or now)) / 3600.0 | |
| 142 | + if abs(cur["rate"] - p["rate"]) > JUMP_MAX and age_h < JUMP_WINDOW_H: | |
| 143 | + rejected.append( | |
| 144 | + f"{p.get('product_name') or pk}: {cur['rate']} -> " | |
| 145 | + f"{p['rate']} (saut aberrant)") | |
| 146 | + continue | |
| 147 | + con.execute("UPDATE rate_observations SET valid_to=? WHERE id=?", | |
| 148 | + (now, cur["id"])) | |
| 149 | + changed += 1 | |
| 150 | + con.execute( | |
| 151 | + "INSERT INTO rate_observations (provider, institution, " | |
| 152 | + "product_key, product_name, rate_type, term_months, kind, rate, " | |
| 153 | + "apr, insured_status, purpose, amortization_max_years, " | |
| 154 | + "conditions, source_url, confidence, raw, valid_from, " | |
| 155 | + "valid_to, last_checked) " | |
| 156 | + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NULL,?)", | |
| 157 | + (provider, p["institution"], pk, p.get("product_name"), | |
| 158 | + p["rate_type"], p["term_months"], p["kind"], p["rate"], | |
| 159 | + p.get("apr"), p.get("insured_status") or "unknown", | |
| 160 | + p.get("purpose") or "purchase", p.get("amortization_max_years"), | |
| 161 | + p.get("conditions"), p.get("source_url"), | |
| 162 | + p.get("confidence", 1.0), | |
| 163 | + json.dumps(p.get("raw"), ensure_ascii=False) if p.get("raw") else None, | |
| 164 | + now, now)) | |
| 165 | + con.commit() | |
| 166 | + return {"seen": len(products), "changed": changed, | |
| 167 | + "rejected": len(rejected), "rejected_details": rejected} | |
| 168 | + | |
| 169 | + | |
| 170 | +def _row(r: sqlite3.Row) -> dict: | |
| 171 | + d = dict(r) | |
| 172 | + d.pop("raw", None) | |
| 173 | + now = time.time() | |
| 174 | + d["age_minutes"] = round((now - (d.get("last_checked") or now)) / 60) | |
| 175 | + d["stale"] = d["age_minutes"] > STALE_H * 60 | |
| 176 | + return d | |
| 177 | + | |
| 178 | + | |
| 179 | +def current_rates(con: sqlite3.Connection, rate_type: str | None = None, | |
| 180 | + term_months: int | None = None, kind: str | None = None, | |
| 181 | + insured_status: str | None = None, | |
| 182 | + purpose: str | None = None, | |
| 183 | + provider: str | None = None) -> list[dict]: | |
| 184 | + """Taux courants (dernière donnée valide par produit), filtrables.""" | |
| 185 | + q = ("SELECT * FROM rate_observations WHERE valid_to IS NULL") | |
| 186 | + args: list = [] | |
| 187 | + for col, val in (("rate_type", rate_type), ("term_months", term_months), | |
| 188 | + ("kind", kind), ("provider", provider), | |
| 189 | + ("purpose", purpose)): | |
| 190 | + if val is not None: | |
| 191 | + q += f" AND {col}=?" | |
| 192 | + args.append(val) | |
| 193 | + if insured_status is not None: | |
| 194 | + q += " AND insured_status IN (?, 'unknown')" | |
| 195 | + args.append(insured_status) | |
| 196 | + q += " ORDER BY provider, term_months, rate" | |
| 197 | + return [_row(r) for r in con.execute(q, args).fetchall()] | |
| 198 | + | |
| 199 | + | |
| 200 | +def best_rate(con: sqlite3.Connection, rate_type: str = "fixed", | |
| 201 | + term_months: int = 60, insured_status: str | None = None, | |
| 202 | + purpose: str = "purchase") -> dict | None: | |
| 203 | + """Meilleur taux courant pour un produit comparable (privilégie les taux | |
| 204 | + « special », sinon posted). Retourne la ligne complète + contexte.""" | |
| 205 | + rows = current_rates(con, rate_type=rate_type, term_months=term_months, | |
| 206 | + insured_status=insured_status, purpose=purpose) | |
| 207 | + if not rows: | |
| 208 | + return None | |
| 209 | + # Un seul candidat par institution : special prioritaire, sinon posted. | |
| 210 | + by_inst: dict[str, dict] = {} | |
| 211 | + for r in rows: | |
| 212 | + cur = by_inst.get(r["provider"]) | |
| 213 | + if cur is None: | |
| 214 | + by_inst[r["provider"]] = r | |
| 215 | + elif r["kind"] == "special" and cur["kind"] == "posted": | |
| 216 | + by_inst[r["provider"]] = r | |
| 217 | + elif r["kind"] == cur["kind"] and r["rate"] < cur["rate"]: | |
| 218 | + by_inst[r["provider"]] = r | |
| 219 | + candidates = sorted(by_inst.values(), key=lambda r: r["rate"]) | |
| 220 | + best = candidates[0] | |
| 221 | + rates = [r["rate"] for r in candidates] | |
| 222 | + return { | |
| 223 | + **best, | |
| 224 | + "median_rate": round(statistics.median(rates), 2) if rates else None, | |
| 225 | + "institutions_count": len(candidates), | |
| 226 | + "per_institution": candidates, | |
| 227 | + } | |
| 228 | + | |
| 229 | + | |
| 230 | +def history(con: sqlite3.Connection, rate_type: str, term_months: int, | |
| 231 | + provider: str | None = None, kind: str | None = None, | |
| 232 | + days: int = 365) -> list[dict]: | |
| 233 | + """Historique : périodes de validité (valid_from/valid_to) par produit.""" | |
| 234 | + since = time.time() - days * 86400 | |
| 235 | + q = ("SELECT provider, institution, product_name, kind, rate, " | |
| 236 | + "insured_status, valid_from, valid_to, last_checked, source_url " | |
| 237 | + "FROM rate_observations WHERE rate_type=? AND term_months=? " | |
| 238 | + "AND (valid_to IS NULL OR valid_to >= ?)") | |
| 239 | + args: list = [rate_type, term_months, since] | |
| 240 | + if provider: | |
| 241 | + q += " AND provider=?" | |
| 242 | + args.append(provider) | |
| 243 | + if kind: | |
| 244 | + q += " AND kind=?" | |
| 245 | + args.append(kind) | |
| 246 | + q += " ORDER BY provider, valid_from" | |
| 247 | + return [dict(r) for r in con.execute(q, args).fetchall()] | |
| 248 | + | |
| 249 | + | |
| 250 | +def rate_at(con: sqlite3.Connection, rate_type: str, term_months: int, | |
| 251 | + ts: float, kind: str = "special") -> float | None: | |
| 252 | + """Meilleur taux observé (toutes institutions) à un instant donné.""" | |
| 253 | + rows = con.execute( | |
| 254 | + "SELECT MIN(rate) AS r FROM rate_observations " | |
| 255 | + "WHERE rate_type=? AND term_months=? AND kind=? AND valid_from<=? " | |
| 256 | + "AND (valid_to IS NULL OR valid_to>?) AND last_checked>=?", | |
| 257 | + (rate_type, term_months, kind, ts, ts, ts - 14 * 86400)).fetchone() | |
| 258 | + if rows is None or rows["r"] is None: | |
| 259 | + # repli : posted si aucun special à cette date | |
| 260 | + rows = con.execute( | |
| 261 | + "SELECT MIN(rate) AS r FROM rate_observations " | |
| 262 | + "WHERE rate_type=? AND term_months=? AND valid_from<=? " | |
| 263 | + "AND (valid_to IS NULL OR valid_to>?)", | |
| 264 | + (rate_type, term_months, ts, ts)).fetchone() | |
| 265 | + return rows["r"] if rows else None | |
| 266 | + | |
| 267 | + | |
| 268 | +def market_stats(con: sqlite3.Connection, rate_type: str = "fixed", | |
| 269 | + term_months: int = 60) -> dict | None: | |
| 270 | + """Métriques Mortgage Intelligence : meilleur, médian, spread, | |
| 271 | + variations 7/30/90 jours, plus bas observé 6 mois.""" | |
| 272 | + best = best_rate(con, rate_type=rate_type, term_months=term_months) | |
| 273 | + if best is None: | |
| 274 | + return None | |
| 275 | + now = time.time() | |
| 276 | + out = { | |
| 277 | + "rate_type": rate_type, | |
| 278 | + "term_months": term_months, | |
| 279 | + "best": best["rate"], | |
| 280 | + "best_provider": best["provider"], | |
| 281 | + "best_institution": best["institution"], | |
| 282 | + "best_kind": best["kind"], | |
| 283 | + "median": best["median_rate"], | |
| 284 | + "spread": (round(best["median_rate"] - best["rate"], 2) | |
| 285 | + if best["median_rate"] is not None else None), | |
| 286 | + "institutions_count": best["institutions_count"], | |
| 287 | + } | |
| 288 | + for label, days in (("var_7d", 7), ("var_30d", 30), ("var_90d", 90)): | |
| 289 | + past = rate_at(con, rate_type, term_months, now - days * 86400) | |
| 290 | + out[label] = round(best["rate"] - past, 2) if past is not None else None | |
| 291 | + low = con.execute( | |
| 292 | + "SELECT MIN(rate) AS r FROM rate_observations " | |
| 293 | + "WHERE rate_type=? AND term_months=? AND kind='special' " | |
| 294 | + "AND last_checked >= ?", | |
| 295 | + (rate_type, term_months, now - 182 * 86400)).fetchone() | |
| 296 | + out["lowest_6m"] = low["r"] if low and low["r"] is not None else None | |
| 297 | + return out | |
| 298 | + | |
| 299 | + | |
| 300 | +def log_run(con: sqlite3.Connection, provider: str, ok: bool, status: str, | |
| 301 | + products: int = 0, changed: int = 0, rejected: int = 0, | |
| 302 | + duration_ms: int = 0, message: str = "") -> None: | |
| 303 | + con.execute( | |
| 304 | + "INSERT INTO provider_runs (provider, ts, ok, status, products, " | |
| 305 | + "changed, rejected, duration_ms, message) VALUES (?,?,?,?,?,?,?,?,?)", | |
| 306 | + (provider, time.time(), 1 if ok else 0, status, products, changed, | |
| 307 | + rejected, duration_ms, message[:500])) | |
| 308 | + con.commit() | |
| 309 | + | |
| 310 | + | |
| 311 | +def provider_health(con: sqlite3.Connection) -> list[dict]: | |
| 312 | + """Dernier état de chaque provider : OK / WARNING / ERROR + fraîcheur.""" | |
| 313 | + rows = con.execute( | |
| 314 | + "SELECT p.* FROM provider_runs p JOIN (SELECT provider, MAX(ts) AS m " | |
| 315 | + "FROM provider_runs GROUP BY provider) x " | |
| 316 | + "ON p.provider=x.provider AND p.ts=x.m ORDER BY p.provider").fetchall() | |
| 317 | + now = time.time() | |
| 318 | + out = [] | |
| 319 | + for r in rows: | |
| 320 | + d = dict(r) | |
| 321 | + n_current = con.execute( | |
| 322 | + "SELECT COUNT(*) AS n, MAX(last_checked) AS mc " | |
| 323 | + "FROM rate_observations WHERE provider=? AND valid_to IS NULL", | |
| 324 | + (r["provider"],)).fetchone() | |
| 325 | + age_min = round((now - r["ts"]) / 60) | |
| 326 | + if r["ok"] and n_current["n"] > 0: | |
| 327 | + level = "WARNING" if age_min > STALE_H * 60 or r["rejected"] else "OK" | |
| 328 | + elif n_current["n"] > 0: | |
| 329 | + level = "WARNING" # échec récent mais données valides conservées | |
| 330 | + else: | |
| 331 | + level = "ERROR" | |
| 332 | + d.update({"level": level, "age_minutes": age_min, | |
| 333 | + "current_products": n_current["n"], | |
| 334 | + "last_data_at": n_current["mc"]}) | |
| 335 | + out.append(d) | |
| 336 | + return out | |
added
immoka/mortgage/validate.py
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# ----------------------------------------------------------------------------- | |
| 2 | +# Immo-Ka — Agrégateur de maisons à vendre (province de Québec) | |
| 3 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 4 | +# mortgage/validate.py : couche de validation des observations de taux. | |
| 5 | +# Règle absolue : ne jamais inventer ni laisser passer un taux impossible. | |
| 6 | +# 4.19 % -> 419 % doit être rejeté ; une bonne donnée n'est jamais écrasée | |
| 7 | +# par une donnée manifestement erronée (garde-fou complémentaire dans | |
| 8 | +# store.record_observations). | |
| 9 | +# ----------------------------------------------------------------------------- | |
| 10 | +from __future__ import annotations | |
| 11 | + | |
| 12 | +RATE_MIN = 0.25 # sous 0,25 % : impossible pour une hypothèque canadienne | |
| 13 | +RATE_MAX = 20.0 # au-delà de 20 % : aberrant (même les prêts privés) | |
| 14 | +TERM_MIN_MONTHS = 3 | |
| 15 | +TERM_MAX_MONTHS = 120 | |
| 16 | + | |
| 17 | +VALID_RATE_TYPES = {"fixed", "variable", "adjustable", "other"} | |
| 18 | +VALID_KINDS = {"posted", "special"} | |
| 19 | +VALID_INSURED = {"insured", "insurable", "uninsured", "unknown"} | |
| 20 | +VALID_PURPOSES = {"purchase", "renewal", "refinance", "unknown"} | |
| 21 | + | |
| 22 | +REQUIRED_FIELDS = ("provider", "institution", "rate_type", "term_months", | |
| 23 | + "kind", "rate", "source_url") | |
| 24 | + | |
| 25 | + | |
| 26 | +def validate_product(p: dict) -> tuple[bool, list[str]]: | |
| 27 | + """Valide UNE observation normalisée. Retourne (ok, problèmes).""" | |
| 28 | + issues: list[str] = [] | |
| 29 | + for f in REQUIRED_FIELDS: | |
| 30 | + if p.get(f) in (None, ""): | |
| 31 | + issues.append(f"champ manquant: {f}") | |
| 32 | + if issues: | |
| 33 | + return False, issues | |
| 34 | + rate = p["rate"] | |
| 35 | + if not isinstance(rate, (int, float)): | |
| 36 | + issues.append(f"taux non numérique: {rate!r}") | |
| 37 | + elif rate <= 0: | |
| 38 | + issues.append(f"taux nul ou négatif: {rate}") | |
| 39 | + elif rate < RATE_MIN or rate > RATE_MAX: | |
| 40 | + issues.append(f"taux impossible: {rate}") | |
| 41 | + term = p["term_months"] | |
| 42 | + if not isinstance(term, int) or not (TERM_MIN_MONTHS <= term <= TERM_MAX_MONTHS): | |
| 43 | + issues.append(f"terme invalide: {term!r}") | |
| 44 | + if p["rate_type"] not in VALID_RATE_TYPES: | |
| 45 | + issues.append(f"rate_type invalide: {p['rate_type']}") | |
| 46 | + if p["kind"] not in VALID_KINDS: | |
| 47 | + issues.append(f"kind invalide: {p['kind']}") | |
| 48 | + if p.get("insured_status", "unknown") not in VALID_INSURED: | |
| 49 | + issues.append(f"insured_status invalide: {p.get('insured_status')}") | |
| 50 | + if p.get("purpose", "purchase") not in VALID_PURPOSES: | |
| 51 | + issues.append(f"purpose invalide: {p.get('purpose')}") | |
| 52 | + apr = p.get("apr") | |
| 53 | + if apr is not None: | |
| 54 | + if not isinstance(apr, (int, float)) or apr < RATE_MIN or apr > RATE_MAX: | |
| 55 | + issues.append(f"APR impossible: {apr!r}") | |
| 56 | + elif isinstance(rate, (int, float)) and apr < rate - 0.02: | |
| 57 | + issues.append(f"APR ({apr}) inférieur au taux contractuel ({rate})") | |
| 58 | + return not issues, issues | |
| 59 | + | |
| 60 | + | |
| 61 | +def validate_batch(products: list[dict]) -> tuple[list[dict], list[str]]: | |
| 62 | + """Valide une passe complète : élimine invalides et duplicatas exacts. | |
| 63 | + Retourne (produits valides, problèmes).""" | |
| 64 | + from .store import product_key | |
| 65 | + ok_products: list[dict] = [] | |
| 66 | + problems: list[str] = [] | |
| 67 | + seen: set[tuple[str, float]] = set() | |
| 68 | + for p in products: | |
| 69 | + valid, issues = validate_product(p) | |
| 70 | + if not valid: | |
| 71 | + name = p.get("product_name") or "?" | |
| 72 | + problems.extend(f"{name}: {i}" for i in issues) | |
| 73 | + continue | |
| 74 | + key = (product_key(p), round(float(p["rate"]), 4)) | |
| 75 | + if key in seen: | |
| 76 | + continue # duplicata exact silencieusement ignoré | |
| 77 | + seen.add(key) | |
| 78 | + ok_products.append(p) | |
| 79 | + return ok_products, problems | |
modified
immoka/seo.py
+8 −1
@@ -610,6 +610,12 @@ _STATIC_META = { | ||
| 610 | 610 | "Toutes les bannières et agences agrégées par Immo-Ka : RE/MAX, Via Capitale, " |
| 611 | 611 | "Sutton, Proprio Direct, Engel & Völkers, Sotheby's, DuProprio et plus.", |
| 612 | 612 | False), |
| 613 | + "/taux-hypothecaires": ( | |
| 614 | + "Taux hypothécaires au Canada — comparateur en direct", | |
| 615 | + "Comparez les taux hypothécaires réellement publiés par RBC, TD, BMO, CIBC, " | |
| 616 | + "Scotia, BNC, Desjardins, Tangerine, EQ et plus — fixes et variables, avec " | |
| 617 | + "source officielle, fraîcheur et historique. Collecte continue par Immo-Ka.", | |
| 618 | + False), | |
| 613 | 619 | "/conditions": ("Conditions d'utilisation", |
| 614 | 620 | "Conditions d'utilisation de la plateforme Immo-Ka (Groupe-Ka).", False), |
| 615 | 621 | "/confidentialite": ("Politique de confidentialité", |
@@ -736,7 +742,8 @@ def sitemap_file(name: str) -> Response: | ||
| 736 | 742 | |
| 737 | 743 | if name == "pages.xml": |
| 738 | 744 | return _xml([_url_el(f"{BASE_URL}{p}") |
| 739 | − for p in ["/", "/stats", "/agences", "/conditions", "/confidentialite"]]) | |
| 745 | + for p in ["/", "/stats", "/agences", "/taux-hypothecaires", | |
| 746 | + "/conditions", "/confidentialite"]]) | |
| 740 | 747 | |
| 741 | 748 | return Response("Sitemap introuvable", status_code=404) |
| 742 | 749 | |
modified
immoka/web.py
+4 −0
@@ -35,6 +35,10 @@ app.add_middleware(GZipMiddleware, minimum_size=1024) | ||
| 35 | 35 | app.include_router(auth.router) |
| 36 | 36 | # favoris ♥ — magasin central au hub Groupe KA, voir immoka/favorites.py |
| 37 | 37 | app.include_router(favorites.router) |
| 38 | +# moteur hypothécaire — taux réels multibanques + calculateur canadien, | |
| 39 | +# voir immoka/mortgage/ (docs/mortgage-engine.md) | |
| 40 | +from .mortgage import api as mortgage_api # noqa: E402 | |
| 41 | +app.include_router(mortgage_api.router) | |
| 38 | 42 | |
| 39 | 43 | _sync_lock = threading.Lock() |
| 40 | 44 | |
modified
run.py
+18 −0
@@ -12,6 +12,9 @@ | ||
| 12 | 12 | python run.py geocode [n] # géocode les annonces sans coordonnées (max n requêtes) |
| 13 | 13 | python run.py poi [n] # commodités de proximité par immeuble (max n requêtes) |
| 14 | 14 | python run.py quartier [n] # rattache chaque annonce à son aire de diffusion (DAUID) |
| 15 | + python run.py mortgage-sync [slug…] # collecte les taux hypothécaires (toutes banques ou celles listées) | |
| 16 | + python run.py mortgage-watch [min] # collecte en boucle (défaut IMMOKA_MORTGAGE_INTERVAL_MIN=180) | |
| 17 | + python run.py mortgage-status # santé des providers de taux (OK/WARNING/ERROR) | |
| 15 | 18 | """ |
| 16 | 19 | from __future__ import annotations |
| 17 | 20 | |
@@ -80,6 +83,21 @@ def main() -> None: | ||
| 80 | 83 | vraiprix_local.enrich_role(lim) |
| 81 | 84 | else: |
| 82 | 85 | vraiprix_local.run(lim, revalidate=reval) |
| 86 | + elif cmd == "mortgage-sync": | |
| 87 | + from immoka.mortgage import scheduler | |
| 88 | + scheduler.run(sys.argv[2:] or None) | |
| 89 | + elif cmd == "mortgage-watch": | |
| 90 | + from immoka.mortgage import scheduler | |
| 91 | + minutes = int(sys.argv[2]) if len(sys.argv) > 2 else None | |
| 92 | + scheduler.watch(minutes) | |
| 93 | + elif cmd == "mortgage-status": | |
| 94 | + from immoka.mortgage import store | |
| 95 | + con = store.connect() | |
| 96 | + for h in store.provider_health(con): | |
| 97 | + print(f"{h['level']:8s} {h['provider']:15s} " | |
| 98 | + f"statut={h.get('status') or '-'} " | |
| 99 | + f"produits_courants={h.get('current_products', 0)} " | |
| 100 | + f"dernière_passe=il y a {h.get('age_minutes', '?')} min") | |
| 83 | 101 | elif cmd == "serve": |
| 84 | 102 | import uvicorn |
| 85 | 103 | port = int(sys.argv[2]) if len(sys.argv) > 2 else 8090 |
added
tests/__init__.py
+0 −0
added
tests/fixtures/mortgage/bank-of-canada.json
+253 −0
@@ -0,0 +1,253 @@ | ||
| 1 | +{ | |
| 2 | + "terms": { | |
| 3 | + "url": "https://www.bankofcanada.ca/terms/" | |
| 4 | + }, | |
| 5 | + "seriesDetail": { | |
| 6 | + "BD.CDN.5YR.DQ.YLD": { | |
| 7 | + "label": "Benchmark bond yield: 5 year", | |
| 8 | + "description": "The yield on the Government of Canada 5-year benchmark bond. This series reports the prevailing yield for the 5-year maturity point on the Canadian government bond yield curve.", | |
| 9 | + "dimension": { | |
| 10 | + "key": "d", | |
| 11 | + "name": "Date" | |
| 12 | + } | |
| 13 | + }, | |
| 14 | + "V39079": { | |
| 15 | + "label": "Target for the overnight rate (business daily)", | |
| 16 | + "description": "Also called the policy interest rate, the average rate that the Bank of Canada wants to see in the market for overnight money market financing. (V39079)", | |
| 17 | + "dimension": { | |
| 18 | + "key": "d", | |
| 19 | + "name": "Date" | |
| 20 | + } | |
| 21 | + }, | |
| 22 | + "V80691333": { | |
| 23 | + "label": "Conventional mortgage: 1-year", | |
| 24 | + "description": "The interest rate for a 1-year conventional mortgage offered by chartered banks in Canada.", | |
| 25 | + "dimension": { | |
| 26 | + "key": "d", | |
| 27 | + "name": "Date" | |
| 28 | + } | |
| 29 | + }, | |
| 30 | + "V80691334": { | |
| 31 | + "label": "Conventional mortgage: 3-year", | |
| 32 | + "description": "The interest rate for a 3-year conventional mortgage offered by chartered banks in Canada.", | |
| 33 | + "dimension": { | |
| 34 | + "key": "d", | |
| 35 | + "name": "Date" | |
| 36 | + } | |
| 37 | + }, | |
| 38 | + "V80691335": { | |
| 39 | + "label": "Conventional mortgage: 5-year", | |
| 40 | + "description": "The interest rate for a 5-year conventional mortgage offered by chartered banks in Canada.", | |
| 41 | + "dimension": { | |
| 42 | + "key": "d", | |
| 43 | + "name": "Date" | |
| 44 | + } | |
| 45 | + } | |
| 46 | + }, | |
| 47 | + "observations": [ | |
| 48 | + { | |
| 49 | + "d": "2026-08-19", | |
| 50 | + "V80691335": { | |
| 51 | + "v": "6.09" | |
| 52 | + }, | |
| 53 | + "BD.CDN.5YR.DQ.YLD": { | |
| 54 | + "v": "3.30" | |
| 55 | + }, | |
| 56 | + "V39079": { | |
| 57 | + "v": "2.25" | |
| 58 | + }, | |
| 59 | + "V80691333": { | |
| 60 | + "v": "5.49" | |
| 61 | + }, | |
| 62 | + "V80691334": { | |
| 63 | + "v": "6.05" | |
| 64 | + } | |
| 65 | + }, | |
| 66 | + { | |
| 67 | + "d": "2026-08-12", | |
| 68 | + "V80691335": { | |
| 69 | + "v": "6.09" | |
| 70 | + }, | |
| 71 | + "BD.CDN.5YR.DQ.YLD": { | |
| 72 | + "v": "3.30" | |
| 73 | + }, | |
| 74 | + "V39079": { | |
| 75 | + "v": "2.25" | |
| 76 | + }, | |
| 77 | + "V80691333": { | |
| 78 | + "v": "5.49" | |
| 79 | + }, | |
| 80 | + "V80691334": { | |
| 81 | + "v": "6.05" | |
| 82 | + } | |
| 83 | + }, | |
| 84 | + { | |
| 85 | + "d": "2026-08-05", | |
| 86 | + "V80691335": { | |
| 87 | + "v": "6.09" | |
| 88 | + }, | |
| 89 | + "V80691333": { | |
| 90 | + "v": "5.49" | |
| 91 | + }, | |
| 92 | + "V80691334": { | |
| 93 | + "v": "6.05" | |
| 94 | + } | |
| 95 | + }, | |
| 96 | + { | |
| 97 | + "d": "2026-07-29", | |
| 98 | + "V80691335": { | |
| 99 | + "v": "6.09" | |
| 100 | + }, | |
| 101 | + "V80691333": { | |
| 102 | + "v": "5.49" | |
| 103 | + }, | |
| 104 | + "V80691334": { | |
| 105 | + "v": "6.05" | |
| 106 | + } | |
| 107 | + }, | |
| 108 | + { | |
| 109 | + "d": "2026-07-22", | |
| 110 | + "V80691335": { | |
| 111 | + "v": "6.09" | |
| 112 | + }, | |
| 113 | + "V80691333": { | |
| 114 | + "v": "5.49" | |
| 115 | + }, | |
| 116 | + "V80691334": { | |
| 117 | + "v": "6.05" | |
| 118 | + } | |
| 119 | + }, | |
| 120 | + { | |
| 121 | + "d": "2026-07-15", | |
| 122 | + "V80691335": { | |
| 123 | + "v": "6.09" | |
| 124 | + }, | |
| 125 | + "V80691333": { | |
| 126 | + "v": "5.49" | |
| 127 | + }, | |
| 128 | + "V80691334": { | |
| 129 | + "v": "6.05" | |
| 130 | + } | |
| 131 | + }, | |
| 132 | + { | |
| 133 | + "d": "2026-07-08", | |
| 134 | + "V80691335": { | |
| 135 | + "v": "6.09" | |
| 136 | + }, | |
| 137 | + "V80691333": { | |
| 138 | + "v": "5.49" | |
| 139 | + }, | |
| 140 | + "V80691334": { | |
| 141 | + "v": "6.05" | |
| 142 | + } | |
| 143 | + }, | |
| 144 | + { | |
| 145 | + "d": "2026-07-01", | |
| 146 | + "V80691335": { | |
| 147 | + "v": "6.09" | |
| 148 | + }, | |
| 149 | + "V80691333": { | |
| 150 | + "v": "5.49" | |
| 151 | + }, | |
| 152 | + "V80691334": { | |
| 153 | + "v": "6.05" | |
| 154 | + } | |
| 155 | + }, | |
| 156 | + { | |
| 157 | + "d": "2026-06-24", | |
| 158 | + "V80691335": { | |
| 159 | + "v": "6.09" | |
| 160 | + }, | |
| 161 | + "V80691333": { | |
| 162 | + "v": "5.49" | |
| 163 | + }, | |
| 164 | + "V80691334": { | |
| 165 | + "v": "6.05" | |
| 166 | + } | |
| 167 | + }, | |
| 168 | + { | |
| 169 | + "d": "2026-06-17", | |
| 170 | + "V80691335": { | |
| 171 | + "v": "6.09" | |
| 172 | + }, | |
| 173 | + "V80691333": { | |
| 174 | + "v": "5.49" | |
| 175 | + }, | |
| 176 | + "V80691334": { | |
| 177 | + "v": "6.05" | |
| 178 | + } | |
| 179 | + }, | |
| 180 | + { | |
| 181 | + "d": "2026-08-21", | |
| 182 | + "BD.CDN.5YR.DQ.YLD": { | |
| 183 | + "v": "3.36" | |
| 184 | + }, | |
| 185 | + "V39079": { | |
| 186 | + "v": "2.25" | |
| 187 | + } | |
| 188 | + }, | |
| 189 | + { | |
| 190 | + "d": "2026-08-20", | |
| 191 | + "BD.CDN.5YR.DQ.YLD": { | |
| 192 | + "v": "3.35" | |
| 193 | + }, | |
| 194 | + "V39079": { | |
| 195 | + "v": "2.25" | |
| 196 | + } | |
| 197 | + }, | |
| 198 | + { | |
| 199 | + "d": "2026-08-18", | |
| 200 | + "BD.CDN.5YR.DQ.YLD": { | |
| 201 | + "v": "3.29" | |
| 202 | + }, | |
| 203 | + "V39079": { | |
| 204 | + "v": "2.25" | |
| 205 | + } | |
| 206 | + }, | |
| 207 | + { | |
| 208 | + "d": "2026-08-17", | |
| 209 | + "BD.CDN.5YR.DQ.YLD": { | |
| 210 | + "v": "3.31" | |
| 211 | + }, | |
| 212 | + "V39079": { | |
| 213 | + "v": "2.25" | |
| 214 | + } | |
| 215 | + }, | |
| 216 | + { | |
| 217 | + "d": "2026-08-14", | |
| 218 | + "BD.CDN.5YR.DQ.YLD": { | |
| 219 | + "v": "3.28" | |
| 220 | + }, | |
| 221 | + "V39079": { | |
| 222 | + "v": "2.25" | |
| 223 | + } | |
| 224 | + }, | |
| 225 | + { | |
| 226 | + "d": "2026-08-13", | |
| 227 | + "BD.CDN.5YR.DQ.YLD": { | |
| 228 | + "v": "3.23" | |
| 229 | + }, | |
| 230 | + "V39079": { | |
| 231 | + "v": "2.25" | |
| 232 | + } | |
| 233 | + }, | |
| 234 | + { | |
| 235 | + "d": "2026-08-11", | |
| 236 | + "BD.CDN.5YR.DQ.YLD": { | |
| 237 | + "v": "3.32" | |
| 238 | + }, | |
| 239 | + "V39079": { | |
| 240 | + "v": "2.25" | |
| 241 | + } | |
| 242 | + }, | |
| 243 | + { | |
| 244 | + "d": "2026-08-10", | |
| 245 | + "BD.CDN.5YR.DQ.YLD": { | |
| 246 | + "v": "3.34" | |
| 247 | + }, | |
| 248 | + "V39079": { | |
| 249 | + "v": "2.25" | |
| 250 | + } | |
| 251 | + } | |
| 252 | + ] | |
| 253 | +} | |
| \ No newline at end of file | ||
added
tests/fixtures/mortgage/bmo.json
+239 −0
@@ -0,0 +1,239 @@ | ||
| 1 | +{ | |
| 2 | + "ca-mortgages-special-rates": { | |
| 3 | + "url": "https://www.bmo.com/public-data/api/v2.0/bmo-ca-mortgages-rates.json", | |
| 4 | + "payload": { | |
| 5 | + "fixed3YearClosedSpecial": 4.64, | |
| 6 | + "fixed3YearClosedSpecialApr": 4.67, | |
| 7 | + "fixed3YearClosedSpecialOver25": 4.74, | |
| 8 | + "fixed3YearClosedSpecialOver25Apr": 4.77, | |
| 9 | + "fixed1YearClosedUnder25Apr": 5.58, | |
| 10 | + "fixed1YearClosedOver25Apr": 5.58, | |
| 11 | + "fixed2YearClosedUnder25Apr": 4.93, | |
| 12 | + "fixed2YearClosedOver25Apr": 4.93, | |
| 13 | + "fixed3YearClosedUnder25Apr": 6.08, | |
| 14 | + "fixed3YearClosedOver25Apr": 6.08, | |
| 15 | + "fixed4YearClosedUnder25Apr": 6.01, | |
| 16 | + "fixed4YearClosedOver25Apr": 6.01, | |
| 17 | + "fixed5YearClosedUnder25Apr": 6.11, | |
| 18 | + "fixed5YearClosedOver25Apr": 6.11, | |
| 19 | + "fixed6YearClosedUnder25Apr": 6.31, | |
| 20 | + "fixed6YearClosedOver25Apr": 6.31, | |
| 21 | + "fixed7YearClosedUnder25Apr": 6.41, | |
| 22 | + "fixed7YearClosedOver25Apr": 6.41, | |
| 23 | + "fixed10YearClosedUnder25Apr": 6.81, | |
| 24 | + "fixed10YearClosedOver25Apr": 6.81, | |
| 25 | + "fixed6MonthConvertibleUnder25Apr": 5.67, | |
| 26 | + "fixed6MonthConvertibleOver25Apr": 5.67, | |
| 27 | + "fixed6MonthOpenUnder25Apr": 10.13, | |
| 28 | + "fixed6MonthOpenOver25Apr": 10.13, | |
| 29 | + "fixed1YearOpenUnder25Apr": 10.04, | |
| 30 | + "fixed1YearOpenOver25Apr": 10.04, | |
| 31 | + "smartFixed5YearClosedSpecial": 4.84, | |
| 32 | + "smartFixed5YearClosedSpecialApr": 4.86, | |
| 33 | + "smartFixed5YearClosedHighRatioSpecial": 4.74, | |
| 34 | + "smartFixed5YearClosedHighRatioSpecialApr": 4.76, | |
| 35 | + "smartFixed5YearClosedPostedApr": 4.81, | |
| 36 | + "smartFixed10YearClosedPostedApr": 5.62, | |
| 37 | + "fixed5YearClosedSmartUnder25Apr": 6.01, | |
| 38 | + "fixed10YearClosedSmartUnder25Apr": 6.71, | |
| 39 | + "variable5YearClosedSpecial": 4.1, | |
| 40 | + "variable5YearClosedSpecialApr": 4.12, | |
| 41 | + "variable5YearClosedSpecialOver25": 4.2, | |
| 42 | + "variable5YearClosedSpecialOver25Apr": 4.22, | |
| 43 | + "variable3YearOpenUnder25Apr": 7.78, | |
| 44 | + "variable3YearOpenOver25Apr": 7.78, | |
| 45 | + "variable5YearClosedUnder25Apr": 4.47, | |
| 46 | + "variable5YearClosedOver25Apr": 4.47 | |
| 47 | + } | |
| 48 | + }, | |
| 49 | + "epm-mortgage": { | |
| 50 | + "url": "https://www.bmo.com/public-data/api/epm/v1.0/bmo-epm-mortgage.json", | |
| 51 | + "payload": { | |
| 52 | + "mortgageRates": { | |
| 53 | + "fixed": { | |
| 54 | + "6MonthConvertible": { | |
| 55 | + "en": "6 month (convertible)", | |
| 56 | + "fr": "6 mois (convertible)", | |
| 57 | + "value": "5.490", | |
| 58 | + "term_months": "6" | |
| 59 | + }, | |
| 60 | + "6MonthOpen": { | |
| 61 | + "en": "6 month (open)", | |
| 62 | + "fr": "6 mois (ouvert)", | |
| 63 | + "value": "9.950", | |
| 64 | + "term_months": "6" | |
| 65 | + }, | |
| 66 | + "1YearClosed": { | |
| 67 | + "en": "1 year (closed)", | |
| 68 | + "fr": "1 an (ferm\u00e9)", | |
| 69 | + "value": "5.490", | |
| 70 | + "term_months": "12" | |
| 71 | + }, | |
| 72 | + "1YearOpen": { | |
| 73 | + "en": "1 year (open)", | |
| 74 | + "fr": "1 an (ouvert)", | |
| 75 | + "value": "9.950", | |
| 76 | + "term_months": "12" | |
| 77 | + }, | |
| 78 | + "2YearClosed": { | |
| 79 | + "en": "2 year (closed)", | |
| 80 | + "fr": "2 ans (ferm\u00e9)", | |
| 81 | + "value": "4.890", | |
| 82 | + "term_months": "24" | |
| 83 | + }, | |
| 84 | + "3YearClosed": { | |
| 85 | + "en": "3 year (closed)", | |
| 86 | + "fr": "3 ans (ferm\u00e9)", | |
| 87 | + "value": "6.050", | |
| 88 | + "term_months": "36" | |
| 89 | + }, | |
| 90 | + "4YearClosed": { | |
| 91 | + "en": "4 year (closed)", | |
| 92 | + "fr": "4 ans (ferm\u00e9)", | |
| 93 | + "value": "5.990", | |
| 94 | + "term_months": "48" | |
| 95 | + }, | |
| 96 | + "5YearClosed": { | |
| 97 | + "en": "5 year (closed)", | |
| 98 | + "fr": "5 ans (ferm\u00e9)", | |
| 99 | + "value": "6.090", | |
| 100 | + "term_months": "60" | |
| 101 | + }, | |
| 102 | + "6YearClosed": { | |
| 103 | + "en": "6 year (closed)", | |
| 104 | + "fr": "6 ans (ferm\u00e9)", | |
| 105 | + "value": "6.290", | |
| 106 | + "term_months": "72" | |
| 107 | + }, | |
| 108 | + "7YearClosed": { | |
| 109 | + "en": "7 year (closed)", | |
| 110 | + "fr": "7 ans (ferm\u00e9)", | |
| 111 | + "value": "6.400", | |
| 112 | + "term_months": "84" | |
| 113 | + }, | |
| 114 | + "10Yearclosed": { | |
| 115 | + "en": "10 year(closed)", | |
| 116 | + "fr": "10 ans (ferm\u00e9)", | |
| 117 | + "value": "6.800", | |
| 118 | + "term_months": "120" | |
| 119 | + }, | |
| 120 | + "18YearOpen": { | |
| 121 | + "en": "18 year (open)", | |
| 122 | + "fr": "18 ans (ouvert)", | |
| 123 | + "value": "8.500", | |
| 124 | + "term_months": "216" | |
| 125 | + } | |
| 126 | + }, | |
| 127 | + "variable": { | |
| 128 | + "12VariableLimited": { | |
| 129 | + "en": "012 VARIABLE LIMITED", | |
| 130 | + "fr": "VARIABLE LIMITEE", | |
| 131 | + "value": "2.750", | |
| 132 | + "term_months": "12" | |
| 133 | + }, | |
| 134 | + "12VariableOpen": { | |
| 135 | + "en": "012 VARIABLE OPEN", | |
| 136 | + "fr": "VARIABLE OUVERT", | |
| 137 | + "value": "2.750", | |
| 138 | + "term_months": "12" | |
| 139 | + }, | |
| 140 | + "3YearOpen": { | |
| 141 | + "en": "3 year (open)", | |
| 142 | + "fr": "3 ans (ouvert)", | |
| 143 | + "value": "7.750", | |
| 144 | + "term_months": "36" | |
| 145 | + }, | |
| 146 | + "5YearClosed": { | |
| 147 | + "en": "5 year (closed)", | |
| 148 | + "fr": "5 ans (ferm\u00e9)", | |
| 149 | + "value": "4.450", | |
| 150 | + "term_months": "60" | |
| 151 | + } | |
| 152 | + }, | |
| 153 | + "fixedEcoSmartRate": { | |
| 154 | + "5YearBmoEcoSmartMortgageTmClosed": { | |
| 155 | + "en": "5 year (BMO Eco Smart Mortgage (TM) closed)", | |
| 156 | + "fr": "5 ans (Hypoth\u00e8que \u00c9nergie Plus BMO (MC) ferm\u00e9)", | |
| 157 | + "value": "5.340", | |
| 158 | + "term_months": "60" | |
| 159 | + } | |
| 160 | + }, | |
| 161 | + "fixedLowRate": { | |
| 162 | + "5YearLowRateClosed": { | |
| 163 | + "en": "5 year low rate (closed)", | |
| 164 | + "fr": "5 ans - petit taux (ferm\u00e9)", | |
| 165 | + "value": "5.990", | |
| 166 | + "term_months": "60" | |
| 167 | + }, | |
| 168 | + "10YearLowRateClosed": { | |
| 169 | + "en": "10 year low rate (closed)", | |
| 170 | + "fr": "10 ans - petit taux (ferm\u00e9)", | |
| 171 | + "value": "6.700", | |
| 172 | + "term_months": "120" | |
| 173 | + } | |
| 174 | + } | |
| 175 | + }, | |
| 176 | + "specialMortgageRates": { | |
| 177 | + "fixed": { | |
| 178 | + "36Month": "0.000", | |
| 179 | + "48Month": "0.000", | |
| 180 | + "60Month": "5.290", | |
| 181 | + "84Month": "6.350", | |
| 182 | + "120Month": "6.750" | |
| 183 | + }, | |
| 184 | + "fixedEcoSmartRate": { | |
| 185 | + "60Month": "4.090" | |
| 186 | + }, | |
| 187 | + "fixedLowRate": { | |
| 188 | + "60Month": "5.990", | |
| 189 | + "120Month": "6.700" | |
| 190 | + } | |
| 191 | + }, | |
| 192 | + "homeownerReadiline": { | |
| 193 | + "fixed": { | |
| 194 | + "12Month": "5.490", | |
| 195 | + "24Month": "4.890", | |
| 196 | + "36Month": "6.050", | |
| 197 | + "48Month": "5.990", | |
| 198 | + "60Month": "6.090", | |
| 199 | + "72Month": "6.290", | |
| 200 | + "84Month": "6.400", | |
| 201 | + "120Month": "6.800" | |
| 202 | + }, | |
| 203 | + "variable": { | |
| 204 | + "60Month": "4.450" | |
| 205 | + } | |
| 206 | + }, | |
| 207 | + "agriInvestRates": { | |
| 208 | + "value": "1.750" | |
| 209 | + }, | |
| 210 | + "timestamp": "8/23/2026, 08:36:22" | |
| 211 | + } | |
| 212 | + }, | |
| 213 | + "epm-prime": { | |
| 214 | + "url": "https://www.bmo.com/public-data/api/epm/v1.0/bmo-epm-prime.json", | |
| 215 | + "payload": { | |
| 216 | + "caPrimeRate": { | |
| 217 | + "value": "4.450", | |
| 218 | + "effectiveDate": "2025-10-30" | |
| 219 | + }, | |
| 220 | + "usBaseRate": { | |
| 221 | + "value": "7.250", | |
| 222 | + "effectiveDate": "2025-12-11" | |
| 223 | + }, | |
| 224 | + "caDepositReferenceRate": { | |
| 225 | + "value": "4.300", | |
| 226 | + "effectiveDate": "2025-10-30" | |
| 227 | + }, | |
| 228 | + "usDepositReferenceRate": { | |
| 229 | + "value": "3.750", | |
| 230 | + "effectiveDate": "2025-12-11" | |
| 231 | + }, | |
| 232 | + "bankOfCanadaOvernightRate": { | |
| 233 | + "value": "2.250", | |
| 234 | + "effectiveDate": "2025-10-30" | |
| 235 | + }, | |
| 236 | + "timestamp": "8/23/2026, 08:36:22" | |
| 237 | + } | |
| 238 | + } | |
| 239 | +} | |
| \ No newline at end of file | ||
added
tests/fixtures/mortgage/cibc.json
+107 −0
@@ -0,0 +1,107 @@ | ||
| 1 | +var p5YRVARCLO = { | |
| 2 | +lobId : 5, | |
| 3 | +expiryDate : null, | |
| 4 | +inceptionDate : 'Fri Mar 07 00:00:00 EST 2008', | |
| 5 | +rates : [ | |
| 6 | +['5_null_null_Years_T', null, 2, '4.12', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null], | |
| 7 | +['3_null_null_Years_T', null, 18, '4.05', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null], | |
| 8 | +['5_null_null_Years_T', null, 18, '4.10', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null], | |
| 9 | +['3_null_null_Years_T', null, 34, '3.45', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null], | |
| 10 | +['3_null_null_Years_T', null, 1, '4.45', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null], | |
| 11 | +['5_null_null_Years_T', null, 1, '4.45', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null], | |
| 12 | +['3_null_null_Years_T', null, 2, '4.07', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null], | |
| 13 | +['5_null_null_Years_T', null, 34, '3.45', 'Published', 'Tue Mar 03 00:00:00 EST 2026' ,null] | |
| 14 | +]} | |
| 15 | +var VROM = { | |
| 16 | +lobId : 5, | |
| 17 | +expiryDate : null, | |
| 18 | +inceptionDate : 'Sat Mar 24 00:00:00 EDT 2007', | |
| 19 | +rates : [ | |
| 20 | +['5_null_null_Years_T', null, 2, '-99.999999991', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null], | |
| 21 | +['5_null_null_Years_T', null, 18, '-99.999999991', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null], | |
| 22 | +['5_null_null_Years_T', null, 1, '7.75', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null], | |
| 23 | +['5_null_null_Years_T', null, 34, '7.00', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null] | |
| 24 | +]} | |
| 25 | +var FOM = { | |
| 26 | +lobId : 5, | |
| 27 | +expiryDate : null, | |
| 28 | +inceptionDate : 'Sat Mar 24 00:00:00 EDT 2007', | |
| 29 | +rates : [ | |
| 30 | +['1_null_null_Year_T', null, 2, '-99.999999991', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null], | |
| 31 | +['1_null_null_Year_T', null, 1, '10.00', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null], | |
| 32 | +['1_null_null_Year_T', null, 34, '9.10', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null], | |
| 33 | +['6_null_null_Months_T', null, 2, '-99.999999991', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null], | |
| 34 | +['6_null_null_Months_T', null, 18, '0.00', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null], | |
| 35 | +['6_null_null_Months_T', null, 1, '10.00', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null], | |
| 36 | +['6_null_null_Months_T', null, 34, '9.95', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null], | |
| 37 | +['1_null_null_Year_T', null, 18, '0.00', 'Published', 'Thu Jul 13 00:00:00 EDT 2023' ,null] | |
| 38 | +]} | |
| 39 | +var FRCM = { | |
| 40 | +lobId : 5, | |
| 41 | +expiryDate : null, | |
| 42 | +inceptionDate : 'Sat Mar 24 00:00:00 EDT 2007', | |
| 43 | +rates : [ | |
| 44 | +['1_null_null_Year_T', null, 2, '4.76', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 45 | +['1_null_null_Year_T', null, 1, '4.99', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 46 | +['4_null_null_Years_T', null, 18, '4.89', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 47 | +['4_null_null_Years_T', null, 34, '3.99', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 48 | +['5_null_null_Years_T', null, 1, '6.49', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 49 | +['10_null_null_Years_T', null, 2, '-99.999999991', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 50 | +['10_null_null_Years_T', null, 1, '6.79', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 51 | +['5_null_null_Years_T', null, 18, '4.94', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 52 | +['7_null_null_Years_T', null, 1, '6.30', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 53 | +['4_null_null_Years_T', null, 2, '4.91', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 54 | +['7_null_null_Years_T', null, 2, '5.13', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 55 | +['4_null_null_Years_T', null, 1, '6.19', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 56 | +['5_null_null_Years_T', null, 34, '4.09', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 57 | +['7_null_null_Years_T', null, 34, '4.29', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 58 | +['2_null_null_Years_T', null, 18, '4.49', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 59 | +['7_null_null_Years_T', null, 18, '5.11', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 60 | +['3_null_null_Years_T', null, 1, '6.14', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 61 | +['3_null_null_Years_T', null, 2, '4.76', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 62 | +['2_null_null_Years_T', null, 34, '3.84', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 63 | +['1_null_null_Year_T', null, 18, '4.74', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 64 | +['10_null_null_Years_T', null, 18, '-99.999999991', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 65 | +['1_null_null_Year_T', null, 34, '4.54', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 66 | +['10_null_null_Years_T', null, 34, '4.42', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 67 | +['5_null_null_Years_T', null, 2, '4.96', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 68 | +['3_null_null_Years_T', null, 18, '4.74', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 69 | +['3_null_null_Years_T', null, 34, '3.79', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 70 | +['2_null_null_Years_T', null, 1, '5.24', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 71 | +['2_null_null_Years_T', null, 2, '4.51', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null] | |
| 72 | +]} | |
| 73 | +var MICRO = { | |
| 74 | +lobId : 5, | |
| 75 | +expiryDate : null, | |
| 76 | +inceptionDate : 'Thu Jan 13 00:00:00 EST 2011', | |
| 77 | +rates : [ | |
| 78 | +['5_null_null_Years_T', null, 2, '4.61', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 79 | +['5_null_null_Years_T', null, 18, '4.59', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null], | |
| 80 | +['5_null_null_Years_T', null, 1, '6.49', 'Published', 'Fri Jul 10 00:00:00 EDT 2026' ,null] | |
| 81 | +]} | |
| 82 | +var CCM = { | |
| 83 | +lobId : 5, | |
| 84 | +expiryDate : null, | |
| 85 | +inceptionDate : 'Sat Mar 24 00:00:00 EDT 2007', | |
| 86 | +rates : [ | |
| 87 | +['6_null_null_Months_T', null, 2, '-99.999999991', 'Published', 'Tue Feb 11 00:00:00 EST 2025' ,null], | |
| 88 | +['6_null_null_Months_T', null, 18, '0.00', 'Published', 'Tue Feb 11 00:00:00 EST 2025' ,null], | |
| 89 | +['6_null_null_Months_T', null, 1, '7.55', 'Published', 'Tue Feb 11 00:00:00 EST 2025' ,null], | |
| 90 | +['6_null_null_Months_T', null, 34, '7.50', 'Published', 'Tue Feb 11 00:00:00 EST 2025' ,null] | |
| 91 | +]} | |
| 92 | +var MICROVAR = { | |
| 93 | +lobId : 5, | |
| 94 | +expiryDate : null, | |
| 95 | +inceptionDate : 'Fri Jun 10 00:00:00 EDT 2011', | |
| 96 | +rates : [ | |
| 97 | +['5_null_null_Years_T', null, 2, '3.97', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null], | |
| 98 | +['5_null_null_Years_T', null, 18, '3.95', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null], | |
| 99 | +['5_null_null_Years_T', null, 1, '4.45', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null] | |
| 100 | +]} | |
| 101 | +var PRIME = { | |
| 102 | +lobId : 1, | |
| 103 | +expiryDate : null, | |
| 104 | +inceptionDate : 'Fri Jan 01 00:00:00 EST 1960', | |
| 105 | +rates : [ | |
| 106 | +[null, null, null, '4.45', 'Published', 'Thu Oct 30 00:00:00 EDT 2025' ,null] | |
| 107 | +]} | |
added
tests/fixtures/mortgage/desjardins.html
+3 −0
@@ -0,0 +1,3 @@ | ||
| 1 | +<!doctype html><html lang="fr"><head><meta name="mw-date-published" content="2022-09-12"><meta name="mw-date-modified" content="2026-08-10"><meta name="mw-type-page" content="Page d'accueil"><meta name="mw-page-name" content="accueil:hypotheque:taux-hypothecaires"><meta name="mw-lang-en" content="https://www.desjardins.com/en/mortgage/mortgage-rates.html"><meta name="mw-lang-fr" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><meta name="content-page-ref" content="ovnR7Vdh4Q-ODglL5i5BsQwm04GtbtrdVgIsSrXiMD6tRZRThCgA3b9LMzY86_2o7Wn6sGm9KU9URgPlEfF2SA4YmsgTx8UI1ttXtSSMzsu8sYt1IOqZCBh329ze_FNE"/> | |
| 2 | +<script defer="defer" type="text/javascript" src="https://rum.hlx.page/.rum/@adobe/helix-rum-js@%5E2/dist/rum-standalone.js" data-routing="env=prod,tier=publish,ams=Groupe Technologies Desjardins"></script> | |
| 3 | +<script id="consentementCookiesScript" src="https://static.desjardins.com/fw/cookie/scriptCookie.js" data-domain-script="e9872dc2-14af-4d30-b0e9-01b95a0b9ab1"></script><script data-ot-ignore>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.setAttributeNode(d.createAttribute('data-ot-ignore'));j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl + "";f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer',"GTM\u002D5R3PP9");</script><meta charset="UTF-8"><title>Taux hypothécaires actuels : taux fixes et variables - Desjardins</title><meta name="keywords" content="Information,Taux hypothécaires,Taux hypothécaires promotionnels,Prêt hypothécaire,Particuliers"><meta name="description" content="Découvrez nos taux hypothécaires fixes et variables en vigueur. Trouvez le prêt qui répond à vos besoins et réservez votre taux."><meta name="searchCategory" content="Hypothèque"><script type="application/ld+json">{"@context": "https://schema.org","@type": "FAQPage","mainEntity": [{"@type": "Question","name": "<h3>Pourquoi les taux hypothécaires augmentent-ils?</h3>","acceptedAnswer": {"@type": "Answer","text": "<p>La variation à la hausse ou à la baisse des taux hypothécaires dépend principalement du taux directeur établi par la Banque du Canada. Le taux directeur fluctue selon la situation économique au Canada et à l'étranger. Son rôle est de réguler l'inflation en fonction de la croissance économique. Une hausse du taux directeur, et donc des taux hypothécaires, sert à ralentir l'inflation, à stimuler l'épargne et à stabiliser le cycle économique. </p><p>Pour en savoir plus, lisez l'article <a href=\"https://www.desjardins.com/qc/fr/conseils/hausse-taux-hypothecaires-4-questions-reponses.html\" target=\"_blank\" rel=\"noopener noreferrer\">Hausse des taux hypothécaires : 4 questions et leurs réponses</a>.</p>\""}},{"@type": "Question","name": "<h3>Pourquoi réserver mon taux hypothécaire?</h3>","acceptedAnswer": {"@type": "Answer","text": "<p>Réserver votre taux hypothécaire vous permet de vous protéger des hausses de taux pendant vos démarches d'achat de propriété. Nous fixons votre taux en fonction de votre dossier et la durée pour laquelle il est garanti selon votre projet et vos besoins. Pour que votre taux reste garanti, votre dossier et les paramètres de votre financement doivent rester les mêmes durant la période convenue. Sinon, votre garantie de taux pourrait devoir être réévaluée en fonction des derniers taux en vigueur.</p><p>Contactez-nous pour en savoir plus ou réserver votre taux.</p><p><a href=\"https://rappel.desjardins.com/#/dcom-pleine-page?struct=%5B%22VPA%22,%22DPCCCSC%22,%22Financement%22%5D&dest=FIN_Hypotheque_Clic&da=P&source=https:%2F%2Fwww.desjardins.com%2Fparticuliers%2Fprets-marges-cartes-credit%2Fprets-hypothecaires%2Fpreautorisation%2F\" target=\"_blank\" rel=\"noopener noreferrer\">Planifier un appel</a></p>"}},{"@type": "Question","name": "<h3>Comment puis-je me protéger des hausses des taux d'intérêt hypothécaires?</h3>","acceptedAnswer": {"@type": "Answer","text": "<p>Dès le début de vos démarches d'achat de maison, pensez à demander une préautorisation pour garantir votre taux. Évaluez aussi les incidences qu'une augmentation des taux d'intérêt aurait dans votre budget. Même si nous vérifions votre capacité à rembourser votre prêt à un taux plus élevé que celui proposé, votre situation financière peut changer au fil du temps. Assurez-vous donc d'avoir une marge de manœuvre suffisante et de mettre de l'argent de côté dans un <a href=\"https://www.desjardins.com/particuliers/comptes-services-relies/comptes-epargne/\" target=\"_blank\" rel=\"noopener noreferrer\">compte d'épargne</a>.</p>\""}},{"@type": "Question","name": "<h3>J'ai un prêt chez Desjardins. Où puis-je consulter mon taux hypothécaire actuel?</h3>","acceptedAnswer": {"@type": "Answer","text": "<p>Vous pouvez vérifier votre taux actuel et voir d'autres détails sur votre prêt hypothécaire dans AccèsD.</p><h4>Dans un navigateur Web</h4><ol><li>Connectez-vous à <a href=\"https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification/auth/manuel?domaineVirtuel=desjardins&langueCible=fr&executeTime=24\" target=\"_blank\" rel=\"noopener noreferrer\">AccèsD</a>.</li><li>Sous <strong>Cartes, prêts et marges</strong>, choisissez le compte <strong>Prêt hypothécaire résidentiel</strong>.</li><li>Ouvrez le tiroir <strong>Information sur le compte </strong>pour consulter votre taux hypothécaire et d'autres détails.</li></ol><h4>Dans l'appli Services mobiles Desjardins</h4><ol><li>Connectez-vous à <a href=\"https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification/auth/manuel?domaineVirtuel=desjardins&langueCible=fr&executeTime=24\" target=\"_blank\" rel=\"noopener noreferrer\">AccèsD</a>.</li><li> Sous <strong>Accès rapide</strong>, choisissez <strong>Mes comptes</strong>.</li><li>Sélectionnez le compte associé à votre prêt hypothécaire résidentiel.</li><li>Sélectionnez <strong>Information</strong>.</li><li>Consultez le <strong>Taux d'intérêt annuel en vigueur</strong>.</li></ol>\""}}]}{"@context": "https://schema.org","about": [{"@type": "Thing","name": "Taux d'intérêt","description": "Le taux d'intérêt d'un prêt ou d'un emprunt fixe la rémunération du capital prêté (exprimée en pourcentage du montant prêté) versée par l'emprunteur au prêteur","SameAs": ["https://www.wikidata.org/wiki/Q179179","https://fr.wikipedia.org/wiki/Taux_d'intérêt"]},{"@type": "Thing","name": "Crédit hypothécaire","description": "Un crédit hypothécaire est un crédit immobilier qui est garanti par une hypothèque, c'est-à-dire que le prêteur dispose du bien immobilier sous-jacent comme garantie sur le prêt","SameAs": ["https://www.wikidata.org/wiki/Q1210094","https://fr.wikipedia.org/wiki/Crédit_hypothécaire"]}],"mentions": [{"@type": "Thing","name": "Taux directeur","description": "Les taux directeurs sont les taux d'intérêt au jour le jour fixés par la banque centrale d'un pays ou d'une union monétaire, et qui permettent à celle-ci de réguler l'activité économique","SameAs": ["https://www.wikidata.org/wiki/Q1210392","https://fr.wikipedia.org/wiki/Taux_directeur"]},{"@type": "Thing","name": "Banque du Canada","description": "La Banque du Canada (en anglais : Bank of Canada) est la banque centrale du Canada. Elle est mise en place et régulée par la Loi sur la Banque du Canada","SameAs": ["https://www.wikidata.org/wiki/Q806703","https://fr.wikipedia.org/wiki/Banque_du_Canada"]},{"@type": "Thing","name": "Caisses Desjardins","description": "Le Mouvement des Caisses Desjardins est une coopérative de caisses populaires fondé le 6 décembre 1900 par Alphonse Desjardins à Lévis (Québec, Canada), où est aujourd'hui établi son siège social, bien que la majorité de ses dirigeants et de ses activités sont basées au Complexe Desjardins du centre-ville de Montréal","SameAs": ["https://www.wikidata.org/wiki/Q2933350","https://fr.wikipedia.org/wiki/Caisses_Desjardins"]}]}</script><link rel="canonical" href="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><link rel="alternate" hreflang="en-ca" href="https://www.desjardins.com/en/mortgage/mortgage-rates.html"><link rel="alternate" hreflang="fr-ca" href="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><meta name="template" content="page-content"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="robots" content="INDEX,FOLLOW"><meta property="twitter:title" content="Taux hypothécaires actuels : taux fixes et variables"><meta property="twitter:card" content="summary"><meta property="twitter:url" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><meta property="twitter:site" content="@mvtdesjardins"><meta property="twitter:image" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.thumb.630.1200.png"><meta property="twitter:description" content="Découvrez nos taux hypothécaires et trouvez le meilleur prêt pour vous."><meta property="og:title" content="Taux hypothécaires actuels : taux fixes et variables"><meta property="og:url" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"><meta property="og:type" content="website"><meta property="og:site_name" content="Desjardins.com"><meta property="og:image" content="https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.thumb.630.1200.png"><meta property="og:description" content="Découvrez nos taux hypothécaires et trouvez le meilleur prêt pour vous."><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-base.min.bc884bc98197eef5529ede0a3ef0bf4d.css" type="text/css"><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-dsd-legacy/4.1.0.min.a94d015a5958379326cf8603af0f5d39.css" type="text/css"><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-dsd/4.1.0.min.810fc0f35f903f7dd0ef5ddb406914e3.css" type="text/css"><script type="module" src="/etc.clientlibs/dcom/clientlibs/clientlib-dsd/4.1.0/resources/library.esm.js"></script><script nomodule="" src="/etc.clientlibs/dcom/clientlibs/clientlib-dsd/4.1.0/resources/library.js"></script><script src="/etc.clientlibs/dcom/components/mocks/analyticsdatatester/clientlibs/clientlib-dependencies.min.a890c282784c557cbb020420f31c7891.js"></script><script src="/etc.clientlibs/dcom/clientlibs/clientlib-dependencies.min.d41d8cd98f00b204e9800998ecf8427e.js"></script><link rel="stylesheet" href="/etc.clientlibs/dcom/components/mocks/analyticsdatatester/clientlibs/clientlib-dependencies.min.ac4f54ecfd6651f744fb7d41e38891c5.css" type="text/css"><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-dependencies.min.d41d8cd98f00b204e9800998ecf8427e.css" type="text/css"><link rel="stylesheet" href="/etc.clientlibs/dcom/clientlibs/clientlib-site.min.f58ed0b57acab47fff773dc716977138.css" type="text/css"><link rel="shortcut icon" type="image/x-icon" href="/etc.clientlibs/dcom/clientlibs/clientlib-base/resources/favicon.ico"><script type="application/ld+json">[{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https://www.desjardins.com/"},{"@type":"ListItem","position":2,"name":"Hypothèque","item":"https://www.desjardins.com/fr/hypotheque.html"},{"@type":"ListItem","position":3,"name":"Taux hypothécaires","item":"https://www.desjardins.com/fr/hypotheque/taux-hypothecaires.html"}]},{"@context":"https://schema.org","@type":"ImageObject","contentUrl":"https://www.desjardins.com/content/dam/images/photos/particuliers/hypotheque/taux%20preferentiel.png"}]</script><script>window.dcomProducts = {"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6M":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6M","id":"6000_6M","rate":"7.9900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6004_5AR":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6004_5AR","id":"6004_5AR","rate":"4.1000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvp":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvp","id":"tvp","rate":"4.7000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_4A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_4A","id":"6000_4A","rate":"4.3900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_5A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_5A","id":"6000_5A","rate":"4.4900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1A","id":"6000_1A","rate":"5.4900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg2":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg2","id":"tvreg2","rate":"5.7000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_10A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_10A","id":"6000_10A","rate":"6.8900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1AO":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1AO","id":"6000_1AO","rate":"9.5000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg","id":"tvreg","rate":"5.7000"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvred":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvred","id":"tvred","rate":"4.4500"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6MO":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6MO","id":"6000_6MO","rate":"9.7500"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tra":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tra","id":"tra","rate":"5.4900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tptvp":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tptvp","id":"tptvp","rate":"7.5400"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_2A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_2A","id":"6000_2A","rate":"5.5900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_3A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_3A","id":"6000_3A","rate":"5.9900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_4A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_4A","id":"6000_4A","rate":"6.0400"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_5A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_5A","id":"6000_5A","rate":"6.0900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6A","id":"6000_6A","rate":"6.2900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_7A":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_7A","id":"6000_7A","rate":"6.3900"},"prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tpcad":{"description":"","cfPath":"/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tpcad","id":"tpcad","rate":"4.450"}};</script></head><body class="page basicpage" id="page-dc14bd2792" data-mw-bloquer-target="true"><script src="/etc.clientlibs/dcom/clientlibs/clientlib-smd.min.089b5f1c4efc35e99ad7165db91241db.js"></script><div class="root container responsivegrid"><div id="container-b47ea7389f" class="cmp-container simple" style=""><header class="msm-experiencefragment experiencefragment"><div id="msm-experiencefragment-8a70c91932" class="cmp-experiencefragment cmp-experiencefragment--header"><div id="container-6d6086367c" class="cmp-container simple" style=""><div class="menu-navigation msm-languagenavigation languagenavigation"><div id="menu-navigation" class="cmp-menu-navigation" data-isprovinceempty="true" data-currentlanguage="fr" data-currentprovincecode="QC" data-provinces="{"AB":{"code":"AB","name":"Alberta","links":{"en":"https://www.desjardins.com/ab/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/ab/fr/hypotheque/taux-hypothecaires.html"}},"BC":{"code":"BC","name":"British Columbia","links":{"en":"https://www.desjardins.com/bc/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/bc/fr/hypotheque/taux-hypothecaires.html"}},"MB":{"code":"MB","name":"Manitoba","links":{"en":"https://www.desjardins.com/mb/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/mb/fr/hypotheque/taux-hypothecaires.html"}},"NB":{"code":"NB","name":"New Brunswick","links":{"en":"https://www.desjardins.com/nb/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/nb/fr/hypotheque/taux-hypothecaires.html"}},"NL":{"code":"NL","name":"Newfoundland and Labrador","links":{"en":"https://www.desjardins.com/nl/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/nl/fr/hypotheque/taux-hypothecaires.html"}},"NS":{"code":"NS","name":"Nova Scotia","links":{"en":"https://www.desjardins.com/ns/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/ns/fr/hypotheque/taux-hypothecaires.html"}},"NT":{"code":"NT","name":"Northwest Territories","links":{"en":"https://www.desjardins.com/nt/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/nt/fr/hypotheque/taux-hypothecaires.html"}},"NU":{"code":"NU","name":"Nunavut","links":{"en":"https://www.desjardins.com/nu/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/nu/fr/hypotheque/taux-hypothecaires.html"}},"ON":{"code":"ON","name":"Ontario","links":{"en":"https://www.desjardins.com/on/en/mortgage/mortgage-rates.html","fr":"https://www.desjardins.com/on/fr/hypotheque/taux-hypothecaires.html"}},"PE":{"code":"PE","name":"Prince Edward Island","links":{"en":"https://www.desjardins.com/pe/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/pe/fr/hypotheque/taux-hypothecaires.html"}},"QC":{"code":"QC","name":"Quebec","links":{"en":"https://www.desjardins.com/qc/en/mortgage/mortgage-rates.html","fr":"https://www.desjardins.com/qc/fr/hypotheque/taux-hypothecaires.html"}},"SK":{"code":"SK","name":"Saskatchewan","links":{"en":"https://www.desjardins.com/sk/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/sk/fr/hypotheque/taux-hypothecaires.html"}},"YT":{"code":"YT","name":"Yukon","links":{"en":"https://www.desjardins.com/yt/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/yt/fr/hypotheque/taux-hypothecaires.html"}},"OC":{"code":"OC","name":"Ontario","links":{}}}"><div class="cmp-menu-navigation__desktop"><div class="cmp-menu-navigation__desktop__topbar"><div class="accessibility-links"><a href="#main-content" class="sr-only sr-only-focusable">Aller au contenu principal</a></div><div class="flex-container dsd-w-full"><div class="logo"><a href="/"> <img src="/content/dam/images/logos/commun/logo-desjardins-fr.svg" width="158" height="34" alt="Retourner à la page d'accueil de Desjardins.com"> </a></div><div class="flex-container"><nav class="secondary-menu" aria-label="Menu secondaire"><ul><li><a href="/a-propos/index.jsp">À propos</a></li><li><a href="/fr/carriere.html">Carrière</a></li><li><a href="/fr/conseils.html">Conseils</a></li><li><a href="/nous-joindre/index.jsp?idSectionRacine=0&niveauSectionRacine=1&idSectionFocus=0&niveauSectionFocus=2">Nous joindre</a></li></ul></nav><nav id="parameters" aria-label="Paramètres"><ul><li><button id="btn-region-options" class="btn btn--regionalisation " aria-expanded="false" aria-controls="regionalisation" type="button"> <span class="dsd-sr-only"> Province ou État actuel : <span class="provinceInputs-sr-only">Québec</span> . Langue : <span class="languageInputs">Français</span> . </span> <span class="btn__text" aria-hidden="true"> <span class="provinceInputs">QC</span> | <span class="languageInputs">Français</span> </span> </button></li><li><button id="btn-search-panel-desktop" class="btn btn--search" aria-expanded="false" aria-controls="search-panel" type="button"> <span class="dsd-sr-only">Rechercher</span> </button></li></ul></nav></div></div></div><div class="cmp-menu-navigation__desktop__hiddenbar"><section id="regionalisation" style="display: none;" class="cmp-menu-navigation__regionalisation dsd-w-full"><form class="form"><div class="form__choose-lang"><fieldset><legend>Choisir votre langue</legend> <label for="rd-lang-fr" class="radio__label"> <input type="radio" id="rd-lang-fr" name="lang" value="fr" checked class="radio__input"> <span class="radio__indicator"></span> <span lang="fr">Français</span> </label> <label for="rd-lang-en" class="radio__label"> <input type="radio" id="rd-lang-en" name="lang" value="en" class="radio__input"> <span class="radio__indicator"></span> <span lang="en">English</span> </label></fieldset></div><div class="form__choose-province"><label for="slt-province">Choisir votre province ou État</label> <select id="slt-province" name="province" class="select"> <option disabled>Choisir</option> <optgroup label="Canada"> <option value="AB">Alberta</option> <option value="BC">Colombie-Britannique</option> <option value="PE">Île-du-Prince-Édouard</option> <option value="MB">Manitoba</option> <option value="NB">Nouveau-Brunswick</option> <option value="NS">Nouvelle-Écosse</option> <option value="NU">Nunavut</option> <option value="ON">Ontario</option> <option value="QC">Québec</option> <option value="SK">Saskatchewan</option> <option value="NL">Terre-Neuve-et-Labrador</option> <option value="NT">Territoires du Nord-Ouest</option> <option value="YT">Yukon</option> </optgroup> <optgroup label="États-Unis"> <option value="USA">Floride</option> </optgroup> </select></div><div class="form__submit"><dsd-button id="btn-regions-options-confirm" variant="primary" theme="brand">Confirmer </dsd-button></div></form> <button id="btn-close-regions-options" class="btn btn-close " type="button"> <span class="dsd-sr-only">Fermer</span><dsd-icon size="sm" icon-name="navigations_contour_fermer"></dsd-icon> </button><div class="tabbable_end_warning" tabindex="0" data-previous-focusable-element-id="btn-close-regions-options" data-quit-focus-element-id="btn-region-options">Vous quittez la boîte de dialogue.</div></section></div><div class="cmp-menu-navigation__desktop__main dsd-w-full"><nav id="main-menu" aria-label="Menu principal"><ul class="main-menu flex-container"><li id="btn-AccesD__desktop"><a href="https://accweb.mouv.desjardins.com/identifiantunique/sso/adp" class="accesD_no_trap"> AccèsD </a></li><li id="btn-AccesD-affaire__desktop"><a href="https://accesdc.mouv.desjardins.com/accueil" class="accesD_no_trap"> AccèsD Affaires </a></li><li id="#main-menu-1"><a id="menu_navigation_accesD__link" href="#main-menu-1" role="button" aria-expanded="false"> Particuliers </a><ul class="main-menu__sub" style="z-index: 100; display: none; overflow: hidden;"><li><a href="/fr/comptes-services.html">Comptes et services</a></li><li><a href="/fr/cartes-credit.html">Cartes de crédit</a></li><li><a href="/fr/hypotheque.html">Hypothèque</a></li><li><a href="/fr/prets-marges-credit.html">Prêts et marges de crédit</a></li><li><a href="/fr/epargne-placements.html">Épargne et placements</a></li><li><a href="/fr/assurances.html">Assurances<span class="dsd-sr-only"> Particuliers</span></a></li><li><a href="/fr/gestion-patrimoine.html">Gestion de patrimoine</a></li><li><a href="/fr/offres.html">Offres</a></li><li><a href="/fr/epargne-placements/epargne-retraite-collective-participants.html">Épargne-retraite collective</a></li><li class="main-menu__sub__chevron"><a href="/particuliers/index.jsp">Voir tout<span class="dsd-sr-only"> les éléments du menu Particuliers</span></a></li></ul></li><li id="#main-menu-2"><a id="menu_navigation_accesD-affaire__link" href="#main-menu-2" role="button" aria-expanded="false"> Entreprises </a><ul class="main-menu__sub" style="z-index: 100; display: none; overflow: hidden;"><li><a href="/fr/entreprises/comptes-tresorerie.html">Comptes et gestion de trésorerie </a></li><li><a href="/fr/entreprises/financement-prets.html">Financement et prêts</a></li><li><a href="/fr/entreprises/cartes-credit.html">Cartes de crédit</a></li><li><a href="/fr/entreprises/projets.html">Projets d’entreprise<br> </a></li><li><a href="/fr/entreprises/offres.html">Offres par secteur</a></li><li><a href="/fr/entreprises/solutions-outils/partenaires.html">Partenaires d’affaires et solutions entreprises</a></li><li><a href="/entreprises/solutions-employeurs/index.jsp">Solutions pour les employeurs</a></li><li><a href="/fr/entreprises/assurances.html">Assurances <span class="dsd-sr-only">Entreprises</span></a></li><li><a href="/fr/entreprises/international.html">Services internationaux</a></li><li><a href="/entreprises/investissement-placements/index.jsp">Investissement et placements</a></li><li><a href="/fr/entreprises/marche-capitaux.html">Marché des capitaux</a></li><li><a href="https://www.fiduciedesjardins.com/" target="_blank" rel="noopener noreferrer">Services fiduciaires<span class="dsd-sr-only">. Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg class="externallink" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 3a1 1 0 110 2H2v17h17V12a1 1 0 012 0v11a1 1 0 01-1 1H1a1 1 0 01-1-1V4a1 1 0 011-1zm11-3a1 1 0 011 1v6a1 1 0 01-2 0V3.41L9.71 15.71a1 1 0 01-1.42 0 1 1 0 010-1.42L20.59 2H17a1 1 0 110-2z" fill-rule="evenodd" /></svg> </a></li><li><a href="/fr/entreprises/solutions-outils/epargne-retraite-collective.html">Épargne-retraite collective</a></li><li class="main-menu__sub__chevron"><a href="/fr/entreprises.html">Voir tout<span class="dsd-sr-only"> les éléments du menu Entreprises</span></a></li></ul></li></ul></nav><nav class="services" aria-label="Accès aux services de Desjardins"><ul class="flex-container"><li><a href="/localisateur/index.jsp#/ps" class="services__localisations"> Points de service </a></li><li><dsd-button id="btn-login" variant="primary" icon-name="navigations_contour_chevron_petit_bas" icon-position="end" theme="brand" type="button"><dsd-icon class="secondary-icon" size="md" fill="dsd-color-icon-reversed" icon-name="contenus_contour_cadenas"></dsd-icon> Se connecter <span class="dsd-sr-only">aux services en ligne de Desjardins. Ouvre une boîte de dialogue</span> </dsd-button> <dsd-button id="btn-logout" variant="primary" icon-name="actions_contour_deconnexion" data-redirect-url="/?deconnexion=true" icon-position="start" theme="brand" type="button">Se déconnecter <span class="dsd-sr-only">des services en ligne de Desjardins.</span> </dsd-button><div id="login-popover" class="cmp-menu-navigation__login-popover is-hidden" role="dialog" aria-labelledby="login-popover-title" tabindex="-1"><div class="cmp-menu-navigation__login-popover__arrow"></div><div class="cmp-menu-navigation__login-popover__content"><h2 id="login-popover-title" tabindex="0">Se connecter</h2><div class="section"><h3>Services en ligne</h3><div class="cmp-menu-navigation__login-popover__logos"><a class="cmp-menu-navigation__login-popover__logos__accesd" href="https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification?domaineVirtuel=desjardins&langueCible=fr" data-mw-action-clic="Entrer sur la page de connexion aux services en ligne AccèsD et AccèsD Affaires."> <img width="100" height="30" alt="" src="/content/dam/images/logo/particuliers/accesd.svg"> <img width="100" height="35" alt="" src="/content/dam/images/logo/entreprises/accesd-affaires.svg"> <span class="dsd-sr-only"> Entrer sur la page de connexion aux services en ligne AccèsD et AccèsD Affaires. </span> </a> <a href="https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification?domaineVirtuel=desjardins&langueCible=fr" class="cmp-menu-navigation__login-popover__button" data-mw-action-clic="Entrer sur la page de connexion aux services en ligne AccèsD et AccèsD Affaires."> <span aria-hidden="true"> Entrer </span> <span class="dsd-sr-only"> Entrer sur la page de connexion aux services en ligne AccèsD et AccèsD Affaires. </span> </a></div><div class="cmp-menu-navigation__login-popover__logos__apps mobile d-block d-md-none"><h4>Accéder à l'application</h4><ul class="apps-link"><li><a href="https://apps.apple.com/ca/app/services-mobiles-desjardins/id386636953?l=fr-CA" target="_blank" rel="noopener noreferrer" data-mw-action-clic="eng|accueil|menu se connecter|na|acceder application apple"> <img src="/etc.clientlibs/dcom/clientlibs/clientlib-site/resources/images/appstore_fr.svg" alt="Télécharger dans l'App Store. Lien externe au site. S’ouvre dans un nouvel onglet."> </a></li><li><a href="https://play.google.com/store/apps/details?id=com.desjardins.mobile&hl=fr_CA" target="_blank" rel="noopener noreferrer" data-mw-action-clic="eng|accueil|menu se connecter|na|acceder application google"> <img src="/etc.clientlibs/dcom/clientlibs/clientlib-site/resources/images/googleplay_fr.svg" alt="Disponible sur Google Play. Lien externe au site. S’ouvre dans un nouvel onglet."> </a></li></ul></div></div><div class="section"><h3>Assurances auto et habitation</h3><div class="cmp-menu-navigation__login-popover__logos"><a class="consentRedirect" href="/fr/assurances/aiguilleur-connexion.html" data-mw-action-clic="Entrer sur la page permettant d'accéder à votre dossier d'assurance auto et habitation en ligne."> <img width="114" height="34" alt="" src="/content/dam/images/logo/assurances/logo-assurance-f.svg"> <span class="dsd-sr-only"> Entrer sur la page permettant d'accéder à votre dossier d'assurance auto et habitation en ligne. </span> </a> <a href="/fr/assurances/aiguilleur-connexion.html" class="cmp-menu-navigation__login-popover__button | consentRedirect" data-mw-action-clic="Entrer sur la page permettant d'accéder à votre dossier d'assurance auto et habitation en ligne."> <span aria-hidden="true"> Entrer </span> <span class="dsd-sr-only"> Entrer sur la page permettant d'accéder à votre dossier d'assurance auto et habitation en ligne. </span> </a></div></div><div class="section"><h3>Courtage en ligne</h3><div class="cmp-menu-navigation__login-popover__logos"><a href="https://www.disnat.com/" target="_blank" rel="noopener" data-mw-action-clic="Entrer sur le site de Desjardins Courtage en ligne."> <img width="114" height="34" alt="" src="/content/dam/images/logo/particuliers/courtage-en-ligne-fr.svg"> <span class="dsd-sr-only"> Entrer sur le site de Desjardins Courtage en ligne - Cet hyperlien s'ouvrira dans une nouvelle fenêtre. </span> </a> <a href="https://www.disnat.com/" class="cmp-menu-navigation__login-popover__button" target="_blank" rel="noopener" data-mw-action-clic="Entrer sur le site de Desjardins Courtage en ligne."> <span aria-hidden="true"> Entrer </span> <span class="dsd-sr-only"> Entrer sur le site de Desjardins Courtage en ligne - Cet hyperlien s'ouvrira dans une nouvelle fenêtre. </span> </a></div></div><div class="section"><h3>Valeurs mobilières</h3><div class="cmp-menu-navigation__login-popover__logos"><a href="https://tmw.secure.vmd.ca/s9web/?firmId=S9FS&lng=fr" target="_blank" rel="noopener" data-mw-action-clic="Entrer sur le site de Desjardins Gestion de patrimoine Valeurs mobilières."> <img width="123" height="43" alt="" src="/content/dam/images/logo/particuliers/gestion-patrimoine-fr.svg"> <span class="dsd-sr-only"> Entrer sur le site de Desjardins Gestion de patrimoine Valeurs mobilières - Cet hyperlien s'ouvrira dans une nouvelle fenêtre. </span> </a> <a href="https://tmw.secure.vmd.ca/s9web/?firmId=S9FS&lng=fr" class="cmp-menu-navigation__login-popover__button" target="_blank" rel="noopener" data-mw-action-clic="Entrer sur le site de Desjardins Gestion de patrimoine Valeurs mobilières."> <span aria-hidden="true"> Entrer </span> <span class="dsd-sr-only"> Entrer sur le site de Desjardins Gestion de patrimoine Valeurs mobilières - Cet hyperlien s'ouvrira dans une nouvelle fenêtre. </span> </a></div></div><div class="section"><div class="cmp-menu-navigation__login-popover__autre"><h3 id="autre-site-titre">Consulter les autres sites de Desjardins</h3><form name="LogonForm" action="#" id="logonAutreForm" method="post" target="_blank"><select id="autreSiteSelect" class="cd-n3-select" aria-labelledby="autre-site-titre"> <option selected value="" id="optionParDefaut">Choisir</option> <optgroup label="Particuliers"> <option value="https://tmw.secure.vmd.ca/s9web/?firmId=S9GPD&lng=fr"> Gestion privée Desjardins </option> <option value="https://tmw.secure.vmd.ca/s9web/?firmId=S9FS&lng=fr"> Service Signature </option> <option value="https://id.desjardins.com/login?state=hKFo2SBybTkzYXk0OFdYZmJKcGdCVDJ5akRIaEFVMklXUVpMcqFupWxvZ2luo3RpZNkgSGdFcHFvWkNOZzBuLVZ1TVA1VEFrM2FFTnpFcTFORXmjY2lk2SBuWUVFOWdzQURqSW1aNkRjTjJYTmIwdWoxbVlNNG95ZA&client=nYEE9gsADjImZ6DcN2XNb0uj1mYM4oyd&protocol=oauth2&response_type=code&redirect_uri=https%3A%2F%2Fwww.assurancevie.desjardins.com&scope=openid%20profile%20email&audience=pise-gpap&nonce=c1dYSE1pQ3NqLXRDWWl6Zm5aZzVqQTRvTkhUeU1DUm5hRDNaVE4zbks1MA%3D%3D&ui_locales=fr&auth0Client=eyJuYW1lIjoiYXV0aDAuanMiLCJ2ZXJzaW9uIjoiOS4xMS4zIn0%3D"> Assurance individuelle </option> <option value="https://www.erc-grs.dsf-dfs.com/erc-grs/ExcludedPath/Login.aspx?Type=prtcpnt&Lang=fr-ca"> Épargne-retraite collective - Participants </option> <option value="https://www.agea-gbim.dsf-dfs.com/AGEA-GBIM/Athntfctn/Authentification_Authentication.aspx?bhcp=1&cltr=fr-CA"> Assurance collective - Adhérents </option> <option value="https://imp.wealthlinkinvestor.com/Trax/sso/SSOLogin.jsf"> Épargne individuelle - Fonds de placement garanti </option> <option value="https://www.securedesjardinsbank.com/dbank/live/app/login/consumer"> Desjardins Bank en ligne – États-Unis </option> </optgroup> <optgroup label="Entreprises"> <option value="https://www.agep-gbip.dsf-dfs.com/AGEP-GBIP/Athntfctn/Authentification_Authentication.aspx?cltr=fr-ca&cc=0&Domd=3002&bhcp=1"> Assurance collective - Administrateurs </option> <option value="https://employeurd.com/WebPortal/UserLogin.aspx?LANGUAGE=fr-CA"> Employeur D paie </option> <option value="https://www.erc-grs.dsf-dfs.com/erc-grs/ExcludedPath/Login.aspx?Type=prmtr&Lang=fr-ca"> Épargne-retraite collective - Promoteurs </option> <option value="https://fisglobal.desjardins.com/unity/djtext/index.html"> Fiducie - Garde de valeurs </option> <option value="https://lcexpressd2.desjardins.com/portal/PasswordLogon.jsp?organization=DJD&branding=djd&brandbutton=Y&locale=fr_CA"> LC Express D </option> <option value="https://desjardins.wealthlinkinvestor.com/Trax/ui/login.jsf?lang=F"> Votre portefeuille en Fonds Desjardins </option> <option value="https://www.securedesjardinsbank.com/dbank/live/app/login/consumer"> Desjardins Bank en ligne – États-Unis (en anglais seulement) </option> <option value="https://desjardinsportal.profitstars.com/"> Affacturage Desjardins </option> </optgroup> </select> <a href="#" class="cmp-menu-navigation__login-popover__button" id="btn_select_logon" target="_blank"> Entrer <span class="sr-only">&nbsp;dans l'application sélectionnée. Elle s'ouvrira dans une nouvelle fenêtre.</span> </a></form></div></div><div class="section"><div class="cmp-menu-navigation__login-popover__security"><dsd-security-guarantee analytics="{"data-mw-action-clic":"eng|accueil|menu se connecter|na|securite garantie"}"></dsd-security-guarantee></div></div></div> <button id="login-popover-close-btn" class="cmp-menu-navigation__login-popover__close-button"> <span class="dsd-sr-only">Fermer</span> </button></div></li></ul></nav></div></div><script>var accesD_link=document.getElementById("menu_navigation_accesD__link");accesD_link.classList.add("current");accesD_link.setAttribute("aria-current","section");</script><div class="cmp-menu-navigation__mobile"><div class="cmp-menu-navigation__mobile__topbar"><div class="accessibility-links"><a href="#main-content" class="sr-only sr-only-focusable">Aller au contenu principal</a></div><div class="flex-container"><div class="btn-menu"><button id="btn-burger" type="button" data-toggle="burger-content" data-target="#burger-content" aria-expanded="false"> <span class="dsd-sr-only">Menu principal</span> <span class="icon-bar icon-bar-first"></span> <span class="icon-bar icon-bar-second"></span> <span class="icon-bar icon-bar-third"></span> </button></div><div class="logo__mobile"><a href="/"> <img src="/content/dam/images/logos/commun/logo-desjardins-fr.svg" height="30" alt="Retourner à la page d'accueil de Desjardins.com"> </a></div><div class="search-panel-section"><button id="btn-search-panel-mobile" class="btn btn--search" aria-expanded="false" aria-controls="search-panel" type="button"> <span class="dsd-sr-only">Rechercher</span> </button><div class="btn-login"><button id="btn-login__mobile" type="button"> <span class="dsd-sr-only">Se connecter aux services en ligne de Desjardins. Ouvre une boîte de dialogue</span> </button> <button id="btn-logout__mobile" type="button"> <span class="dsd-sr-only">Se déconnecter des services en ligne de Desjardins.</span> </button></div></div></div></div><div id="burger-content" class="cmp-menu-navigation__mobile__burger-content"><div class="cmp-menu-navigation__mobile__subbar"><div class="flex-container"><nav id="localisation__mobile" aria-label="Points de service"><ul><li><a href="/localisateur/index.jsp#/ps">Points de service</a></li></ul></nav><nav id="parameters__mobile" aria-label="Paramètres"><ul><li><button id="btn-region-options__mobile" class="btn btn--regionalisation mobile" aria-expanded="false" aria-controls="regionalisation" type="button"> <span class="dsd-sr-only"> Province ou État actuel : <span class="provinceInputs-sr-only">Québec</span> . Langue : <span class="languageInputs">Français</span> . </span> <span class="btn__text" aria-hidden="true"> <span class="provinceInputs">QC</span> | <span class="languageInputs">Français</span> </span> </button></li></ul></nav></div></div><section id="regionalisation__mobile" style="display: none;" class="cmp-menu-navigation__regionalisation"><form class="form"><div class="form__choose-lang"><fieldset><legend>Choisir votre langue</legend> <label for="rd-lang-fr__mobile" class="radio__label"> <input type="radio" id="rd-lang-fr__mobile" name="lang" value="fr" checked class="radio__input"> <span class="radio__indicator"></span> <span lang="fr">Français</span> </label> <label for="rd-lang-en__mobile" class="radio__label"> <input type="radio" id="rd-lang-en__mobile" name="lang" value="en" class="radio__input"> <span class="radio__indicator"></span> <span lang="en">English</span> </label></fieldset></div><div class="form__choose-province"><label for="slt-province__mobile">Choisir votre province ou État</label> <select id="slt-province__mobile" name="province" class="select"> <option disabled>Choisir</option> <optgroup label="Canada"> <option value="AB">Alberta</option> <option value="BC">Colombie-Britannique</option> <option value="PE">Île-du-Prince-Édouard</option> <option value="MB">Manitoba</option> <option value="NB">Nouveau-Brunswick</option> <option value="NS">Nouvelle-Écosse</option> <option value="NU">Nunavut</option> <option value="ON">Ontario</option> <option value="QC">Québec</option> <option value="SK">Saskatchewan</option> <option value="NL">Terre-Neuve-et-Labrador</option> <option value="NT">Territoires du Nord-Ouest</option> <option value="YT">Yukon</option> </optgroup> <optgroup label="États-Unis"> <option value="USA">Floride</option> </optgroup> </select></div><div class="form__submit"><dsd-button id="btn-regions-options-confirm__mobile" variant="primary" theme="brand">Confirmer </dsd-button></div></form> <button id="btn-close-regions-options__mobile" class="btn btn-close mobile" type="button"> <span class="dsd-sr-only">Fermer</span><dsd-icon size="sm" icon-name="navigations_contour_fermer"></dsd-icon> </button><div class="tabbable_end_warning" tabindex="0" data-previous-focusable-element-id="btn-close-regions-options__mobile" data-quit-focus-element-id="btn-region-options__mobile">Vous quittez la boîte de dialogue.</div></section><nav id="main-menu__mobile" aria-label="Menu principal"><ul><li id="btn-AccesD__mobile"><a href="https://accweb.mouv.desjardins.com/identifiantunique/sso/adp"> AccèsD </a></li><li id="btn-AccesD-affaire__mobile"><a href="https://accesdc.mouv.desjardins.com/accueil"> AccèsD Affaires </a></li><li><a href="#" id="menu_navigation_accesD_link_mobile" class="menu-parent-chevron" role="button" aria-expanded="false"> Particuliers </a><ul><li><a class=" " href="/fr/comptes-services.html">Comptes et services</a></li><li><a class=" " href="/fr/cartes-credit.html">Cartes de crédit</a></li><li><a class=" " href="/fr/hypotheque.html">Hypothèque</a></li><li><a class=" " href="/fr/prets-marges-credit.html">Prêts et marges de crédit</a></li><li><a class=" " href="/fr/epargne-placements.html">Épargne et placements</a></li><li><a class=" " href="/fr/assurances.html">Assurances<span class="dsd-sr-only"> Particuliers</span></a></li><li><a class=" " href="/fr/gestion-patrimoine.html">Gestion de patrimoine</a></li><li><a class=" " href="/fr/offres.html">Offres</a></li><li><a class=" " href="/fr/epargne-placements/epargne-retraite-collective-participants.html">Épargne-retraite collective</a></li><li><span class="dsd-sr-only">Menu </span> <a class="menu-child-chevron " href="/particuliers/index.jsp">Voir tout<span class="dsd-sr-only"> les éléments du menu Particuliers</span></a></li></ul></li><li><a href="#" id="menu_navigation_accesD_affaire_link_mobile" class="menu-parent-chevron" role="button" aria-expanded="false"> Entreprises </a><ul><li><a class=" " href="/fr/entreprises/comptes-tresorerie.html">Comptes et gestion de trésorerie </a></li><li><a class=" " href="/fr/entreprises/financement-prets.html">Financement et prêts</a></li><li><a class=" " href="/fr/entreprises/cartes-credit.html">Cartes de crédit</a></li><li><a class=" " href="/fr/entreprises/projets.html">Projets d’entreprise<br> </a></li><li><a class=" " href="/fr/entreprises/offres.html">Offres par secteur</a></li><li><a class=" " href="/fr/entreprises/solutions-outils/partenaires.html">Partenaires d’affaires et solutions entreprises</a></li><li><a class=" " href="/entreprises/solutions-employeurs/index.jsp">Solutions pour les employeurs</a></li><li><a class=" " href="/fr/entreprises/assurances.html">Assurances <span class="dsd-sr-only">Entreprises</span></a></li><li><a class=" " href="/fr/entreprises/international.html">Services internationaux</a></li><li><a class=" " href="/entreprises/investissement-placements/index.jsp">Investissement et placements</a></li><li><a class=" " href="/fr/entreprises/marche-capitaux.html">Marché des capitaux</a></li><li><a class=" " href="https://www.fiduciedesjardins.com/" target="_blank" rel="noopener noreferrer">Services fiduciaires<span class="dsd-sr-only">. Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg class="externallink" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 3a1 1 0 110 2H2v17h17V12a1 1 0 012 0v11a1 1 0 01-1 1H1a1 1 0 01-1-1V4a1 1 0 011-1zm11-3a1 1 0 011 1v6a1 1 0 01-2 0V3.41L9.71 15.71a1 1 0 01-1.42 0 1 1 0 010-1.42L20.59 2H17a1 1 0 110-2z" fill-rule="evenodd" /></svg> </a></li><li><a class=" " href="/fr/entreprises/solutions-outils/epargne-retraite-collective.html">Épargne-retraite collective</a></li><li><span class="dsd-sr-only">Menu </span> <a class="menu-child-chevron " href="/fr/entreprises.html">Voir tout<span class="dsd-sr-only"> les éléments du menu Entreprises</span></a></li></ul></li></ul></nav><nav id="secondary-menu__mobile" aria-label="Menu secondaire"><ul><li><a href="/a-propos/index.jsp">À propos</a><a href="/fr/carriere.html">Carrière</a><a href="/fr/conseils.html">Conseils</a><a href="/nous-joindre/index.jsp?idSectionRacine=0&niveauSectionRacine=1&idSectionFocus=0&niveauSectionFocus=2">Nous joindre</a></li></ul></nav><div class="tabbable_end_warning" tabindex="0" data-previous-focusable-element-id="btn-search__mobile" data-quit-focus-element-id="btn-burger">Vous quittez le menu.</div></div></div><script>var accesD_link=document.getElementById("menu_navigation_accesD_link_mobile");accesD_link.classList.add("current");accesD_link.setAttribute("aria-current","section");</script><div class="side-panel" id="search-panel-top"><div class="side-panel__backdrop" data-panel-action="close"></div><div id="header-v1-top-panel" class="side-panel__panel side-panel__panel--align-top" aria-modal="true" role="dialog" data-active="false" aria-label="aucune" tabindex="-1"><div class="side-panel__body side-panel__body--fixed-content" hidden><div class="cmp-search-panel-section" data-suggest-endpoint="https://www.desjardins.com/fondation-recherche/sn-cacn-prod-ext-desjardins/ent/api/as/v1/engines/search-dcom-fra-crawler-engine/query_suggestion/" data-search-endpoint="https://www.desjardins.com/fondation-recherche/sn-cacn-prod-ext-desjardins/ent/api/as/v1/engines/search-dcom-fra-crawler-engine/search/" data-click-endpoint="https://www.desjardins.com/fondation-recherche/sn-cacn-prod-ext-desjardins/ent/api/as/v1/engines/search-dcom-fra-crawler-engine/click/"><div class="cmp-search-panel-items"><form class="cmp-search-field-form" action="/qc/fr/resultats.html" role="search" method="GET" id="searchPanelForm"><button class="boa-button boa-button--ghost boa-button--large boa-button--icon-only boa-button--neutral" id="cmp-search-field-btn-back" type="button" aria-label="Fermer la barre de recherche"> <span class="boa-button__icon"><svg width="25" height="25" viewbox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="fleche-gauche"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.07183 11.7896L10.0699 5.79388C10.4619 5.40204 11.0974 5.40204 11.4894 5.79388C11.8814 6.18573 11.8814 6.82104 11.4894 7.21288L7.19082 11.4999H20.7764C21.3286 11.4999 21.7761 11.9473 21.7761 12.4991C21.7761 13.051 21.3286 13.4984 20.7764 13.4984H7.19082L11.4894 17.7854C11.6787 17.973 11.7851 18.2285 11.7851 18.4949C11.7851 18.7614 11.6787 19.0168 11.4894 19.2044C11.3017 19.3936 11.0462 19.5 10.7797 19.5C10.5131 19.5 10.2576 19.3936 10.0699 19.2044L4.07183 13.2086C3.88257 13.021 3.77612 12.7656 3.77612 12.4991C3.77612 12.2327 3.88257 11.9773 4.07183 11.7896Z" fill="#00874E" /> </g></svg> </span> </button> <input type="text" placeholder="Rechercher" id="cmp-search-field-input-field" name="mw_re" role="combobox" aria-label="Barre de recherche" maxlength="50" autocomplete="off" aria-controls="autoCompleteDefaultResult autoCompleteSearchResult" aria-autocomplete="list" aria-expanded="true"> <button class="boa-button boa-button--ghost boa-button--xsmall boa-button--icon-only boa-button--neutral" id="cmp-search-field-btn-close" hidden type="button" aria-label="Effacer la recherche"> <span class="boa-button__icon"><svg width="16" height="17" viewbox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg"><g id="fermer"><path fill-rule="evenodd" clip-rule="evenodd" d="M8.93939 8.49944L13.8029 3.64211C14.0642 3.38084 14.0642 2.95724 13.8029 2.69597C13.5417 2.4347 13.1181 2.4347 12.8569 2.69597L8 7.55996L3.14313 2.69597C2.97413 2.52696 2.72781 2.46095 2.49696 2.52281C2.26611 2.58467 2.08579 2.76501 2.02393 2.99588C1.96207 3.22676 2.02808 3.4731 2.19707 3.64211L7.06061 8.49944L2.19707 13.3568C2.07094 13.4819 2 13.6522 2 13.8298C2 14.0075 2.07094 14.1778 2.19707 14.3029C2.32217 14.429 2.49246 14.5 2.6701 14.5C2.84774 14.5 3.01803 14.429 3.14313 14.3029L8 9.43892L12.8569 14.3029C12.982 14.429 13.1523 14.5 13.3299 14.5C13.5075 14.5 13.6778 14.429 13.8029 14.3029C13.9291 14.1778 14 14.0075 14 13.8298C14 13.6522 13.9291 13.4819 13.8029 13.3568L8.93939 8.49944Z" fill="#383838" /> </g></svg> </span> </button> <span id="separatorField" hidden></span> <button class="boa-button boa-button--ghost boa-button--large boa-button--icon-only boa-button--brand" id="cmp-search-field-btn-search" type="submit" aria-label="Lancer la recherche"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> </button></form></div> <button class="boa-button boa-button--ghost boa-button--large side-panel__close-button cmp-search-panel-close-button" aria-label="Fermer la barre de recherche" id="cmp-search-panel-close-button"> <span class="boa-button__text">Fermer</span> </button></div> <span class="cmp-search-panel-items-popular-label" id="popularSearchLabel">Recherches Populaires </span> <span class="cmp-search-panel-items-popular-label" id="popularSearchSuggestedLabel" hidden>RÉSULTATS SUGGÉRÉS</span><div class="side-panel__main"><div class="side-panel__scroll-wrapper side-panel__scroll-wrapper--short"><span class="side-panel__main-scroll-trigger"></span><div class="cmp-search-panel-items-popular-result"><div id="autoCompleteDefaultResult" role="listbox" aria-labelledby="popularSearchLabel"><a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche AccèsD" value="AccèsD" href="/qc/fr/resultats.html?mw_re=AccèsD" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">AccèsD</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche Taux de change" value="Taux de change" href="/qc/fr/resultats.html?mw_re=Taux%20de%20change" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">Taux de change</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche CELI" value="CELI" href="/qc/fr/resultats.html?mw_re=CELI" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">CELI</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche Budget" value="Budget" href="/qc/fr/resultats.html?mw_re=Budget" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">Budget</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche Spécimen de chèque" value="Spécimen de chèque" href="/qc/fr/resultats.html?mw_re=Spécimen%20de%20chèque" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">Spécimen de chèque</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche Convertisseur de devises" value="Convertisseur de devises" href="/qc/fr/resultats.html?mw_re=Convertisseur%20de%20devises" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">Convertisseur de devises</span> </a> <a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral" aria-label="Lancer la recherche BONIDOLLARS" value="BONIDOLLARS" href="/qc/fr/resultats.html?mw_re=BONIDOLLARS" form="searchPanelForm" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> <span class="boa-button__text">BONIDOLLARS</span> </a></div><div id="autoCompleteSearchResult" role="listbox" hidden="true" aria-labelledby="popularSearchSuggestedLabel"><a class="boa-button boa-button--ghost boa-button--xsmall boa-button--neutral autoCompleteResultClass" href="/qc/fr/resultats.html?mw_re=" aria-label="Lancer la recherche" role="option" tabindex="0"> <span class="boa-button__icon"><svg width="24" height="25" viewbox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><g clip-path="url(#clip0_5009_12730_1)"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.8064 22.9004L16.2356 16.1784C19.6025 12.521 19.5177 6.86966 16.0424 3.3149C12.5672 -0.239872 6.91664 -0.455175 3.18072 2.82482C-0.555198 6.10482 -1.07026 11.7333 2.00834 15.6363C5.08694 19.5393 10.6828 20.3522 14.7456 17.4866L22.4976 24.3696C22.9103 24.6029 23.4299 24.5168 23.7451 24.1629C24.0604 23.809 24.0859 23.2832 23.8064 22.9004ZM14.2724 15.3432C12.0988 17.2628 9.00278 17.7339 6.35619 16.5478C3.7096 15.3618 2.00192 12.7378 1.98987 9.83879C1.96547 6.4253 4.28142 3.43852 7.59463 2.61058C10.9078 1.78264 14.3576 3.32863 15.9432 6.35198C17.5288 9.37533 16.8384 13.0906 14.2724 15.3432Z" fill="#00874E" /> </g> <defs><clippath id="clip0_5009_12730_1"><rect width="24" height="24" fill="white" transform="translate(0 0.5)" /> </clippath> </defs></svg> </span> </a></div></div></div></div></div></div></div> <dsd-modal button-primary-label="Fermer" id="timeout-modal"><h2 slot="title">Session expirée</h2><dsd-alert variant="information"><h3 slot="title">Information</h3> Le délai d'inactivité de votre session est expiré. Pour votre sécurité, nous avons fermé votre session. </dsd-alert> </dsd-modal> <span id="usaRedirectUrlFr" data-lang-redirect-url=" https://www.desjardinsbank.com/"></span> <span id="usaRedirectUrlEn" data-lang-redirect-url="https://www.desjardinsbank.com/en/"></span></div></div><div class="regional-preferences-modal-dsd msm-languagenavigation languagenavigation"><dsd-modal id="regionalisation-modal" dark="false" variant="standard" show="false" class="cmp-regional-preferences-modal-dsd" button-primary-label="Confirmer" data-currentlanguage="fr" data-currentprovincecode="QC" data-provinces="{"AB":{"code":"AB","name":"Alberta","links":{"en":"https://www.desjardins.com/ab/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/ab/fr/hypotheque/taux-hypothecaires.html"}},"BC":{"code":"BC","name":"British Columbia","links":{"en":"https://www.desjardins.com/bc/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/bc/fr/hypotheque/taux-hypothecaires.html"}},"MB":{"code":"MB","name":"Manitoba","links":{"en":"https://www.desjardins.com/mb/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/mb/fr/hypotheque/taux-hypothecaires.html"}},"NB":{"code":"NB","name":"New Brunswick","links":{"en":"https://www.desjardins.com/nb/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/nb/fr/hypotheque/taux-hypothecaires.html"}},"NL":{"code":"NL","name":"Newfoundland and Labrador","links":{"en":"https://www.desjardins.com/nl/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/nl/fr/hypotheque/taux-hypothecaires.html"}},"NS":{"code":"NS","name":"Nova Scotia","links":{"en":"https://www.desjardins.com/ns/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/ns/fr/hypotheque/taux-hypothecaires.html"}},"NT":{"code":"NT","name":"Northwest Territories","links":{"en":"https://www.desjardins.com/nt/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/nt/fr/hypotheque/taux-hypothecaires.html"}},"NU":{"code":"NU","name":"Nunavut","links":{"en":"https://www.desjardins.com/nu/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/nu/fr/hypotheque/taux-hypothecaires.html"}},"ON":{"code":"ON","name":"Ontario","links":{"en":"https://www.desjardins.com/on/en/mortgage/mortgage-rates.html","fr":"https://www.desjardins.com/on/fr/hypotheque/taux-hypothecaires.html"}},"PE":{"code":"PE","name":"Prince Edward Island","links":{"en":"https://www.desjardins.com/pe/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/pe/fr/hypotheque/taux-hypothecaires.html"}},"QC":{"code":"QC","name":"Quebec","links":{"en":"https://www.desjardins.com/qc/en/mortgage/mortgage-rates.html","fr":"https://www.desjardins.com/qc/fr/hypotheque/taux-hypothecaires.html"}},"SK":{"code":"SK","name":"Saskatchewan","links":{"en":"https://www.desjardins.com/sk/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/sk/fr/hypotheque/taux-hypothecaires.html"}},"YT":{"code":"YT","name":"Yukon","links":{"en":"https://www.desjardins.com/yt/en/hypotheque/taux-hypothecaires.html","fr":"https://www.desjardins.com/yt/fr/hypotheque/taux-hypothecaires.html"}},"OC":{"code":"OC","name":"Ontario","links":{}}}"><h2 slot="title">Choisir vos paramètres</h2><span id="usaRedirectUrlFr" data-lang-redirect-url="https://www.desjardinsbank.com/"></span><span id="usaRedirectUrlEn" data-lang-redirect-url="https://www.desjardinsbank.com/en/"></span><form class="form"><div class="form__choose-lang"><fieldset><legend>Choisir votre langue</legend> <label for="rd-lang-fr_modal" class="radio__label"> <input type="radio" id="rd-lang-fr_modal" name="lang_modal" value="fr" checked class="radio__input"> <span class="radio__indicator"></span> <span lang="fr">Français</span> </label> <label for="rd-lang-en_modal" class="radio__label"> <input type="radio" id="rd-lang-en_modal" name="lang_modal" value="en" class="radio__input"> <span class="radio__indicator"></span> <span lang="en">English</span> </label></fieldset></div><div class="form__choose-province"><label for="slt-province_modal">Choisir votre province ou État</label> <select id="slt-province_modal" name="province_modal" class="select"> <option disabled>Choisir</option> <optgroup label="Canada"> <option value="AB">Alberta</option> <option value="BC">Colombie-Britannique</option> <option value="PE">Île-du-Prince-Édouard</option> <option value="MB">Manitoba</option> <option value="NB">Nouveau-Brunswick</option> <option value="NS">Nouvelle-Écosse</option> <option value="NU">Nunavut</option> <option value="ON">Ontario</option> <option value="QC">Québec</option> <option value="SK">Saskatchewan</option> <option value="NL">Terre-Neuve-et-Labrador</option> <option value="NT">Territoires du Nord-Ouest</option> <option value="YT">Yukon</option> </optgroup> <optgroup label="États-Unis"> <option value="USA">Floride</option> </optgroup> </select></div></form> </dsd-modal></div><div class="search-field"></div></div></div></header><main class="container responsivegrid"><div id="container-ef17851bea" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="breadcrumb dsd-w-full aem-GridColumn aem-GridColumn--default--12"><nav id="breadcrumb-d2c616c1dc" class="cmp-breadcrumb" aria-label="Chemin de navigation"><ol class="cmp-breadcrumb__list"><li class="cmp-breadcrumb__item"><a href="/?navigMW=ari" class="cmp-breadcrumb__item-link"> Accueil </a></li><li class="cmp-breadcrumb__item"><a href="/fr/hypotheque.html?navigMW=ari" class="cmp-breadcrumb__item-link"> Hypothèque </a></li><li class="cmp-breadcrumb__item cmp-breadcrumb__item--active">Taux hypothécaires</li></ol></nav></div><div class="container responsivegrid aem-GridColumn aem-GridColumn--default--12"><div id="container-ffe6531764" class="cmp-container simple" style=""><div class="vitrine responsivegrid"><div id="at-0043-vitrine" class="cmp-vitrine"><div class="cmp-vitrine cmp-vitrine__container largeImage " style="--vitrine-bg-color:#CCE7D7;"><div class="dsd-w-full flex-container cmp-vitrine__layer"><div class="cmp-vitrine__cartouche"><div><h1 class="cmp-vitrine__pagetitle" style="--pagetitle-text-color:#2f2f2f;">Taux hypothécaires</h1><div class="dsd-mt-lg"><p><span class="dsd-b1"><span class="dsd-b-10">Obtenez un prêt et un taux hypothécaires qui conviennent à vos besoins. Si vous êtes membre, demandez une préautorisation hypothécaire dans nos services mobiles et en ligne pour savoir quel prix vous pourriez payer pour une propriété et réserver votre taux.</span></span></p></div><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="action-link dsd-mt-lg aem-GridColumn aem-GridColumn--default--12"><div class="cmp-action-link"><a href="https://accesdc.mouv.desjardins.com/services/navigation/aiguillage/mon-toit" class="link-principal link-principal-green " data-mw-action-clic="iaw|hypo|taux-hypothecaires|haut|demander une preautorisation"> <span class="mask-button-states"> <span class="cmp-action-link__label">Demander une préautorisation<span class="dsd-sr-only"> hypothécaire dans nos services mobiles et en ligne</span> </span> </span> </a></div></div><div class="text custom-mt-32 aem-GridColumn aem-GridColumn--default--12"><div id="text-04035b8e47" class="cmp-text"><p><span class="dsd-b-10">Vous n'êtes pas membre? <a href="https://rappel.desjardins.com/#/dcom-pleine-page?struct=%5B%22VPA%22,%22DPCCCSC%22,%22Financement%22%5D&dest=FIN_Hypotheque_Clic&da=P&source=https:%2F%2Fwww.desjardins.com%2Fcontent%2Fdcom%2Ffr%2Fhypotheque%2Ftaux-hypothecaires.html" data-mw-action-clic="iat|hypo|taux-hypothecaires|haut|planifier un appel">Planifiez un appel</a> pour prendre rendez-vous pour votre demande de préautorisation.</span></p></div></div><div class="text dsd-mt-lg aem-GridColumn aem-GridColumn--default--12"><div id="text-cdf17a7d3e" class="cmp-text"><p>Taux en vigueur le ${currentDate}</p></div></div></div></div></div></div><div class="cmp-vitrine__image-container"><div class="cmp-vitrine__image"><img src="/content/dam/images/vitrines/particuliers/hypotheque/vitrine-taux.jpg" alt fetchpriority="high" style="--vitrine-translate: 0%; --vitrine-translate-mob: 0%"></div></div></div></div></div><div class="container responsivegrid"><div id="container-1035e488e1" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-dsd-pt-32 aem-GridColumn aem-GridColumn--default--12"><div id="container-0493badef0" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-48eee725a2" tabindex="-1"><h2 class="cmp-title__text ">Trouvez un prêt et un taux hypothécaires adaptés à votre réalité</h2></div></div><div class="text aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="text-b99bb8b429" class="cmp-text"><p>Le taux hypothécaire<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/002-note-generale-taux-hypotheque"><dsd-footnote-ref target="002-note-generale-taux-hypotheque" id="002-note-generale-taux-hypotheque-1">1</dsd-footnote-ref></span> joue souvent un rôle majeur dans le choix d'un prêt. Pour prendre une décision éclairée, il y a toutefois d'autres facteurs à considérer. Votre tolérance au risque, vos connaissances financières et vos projets à court et à long terme en sont quelques-uns.</p><p>Découvrez les taux en vigueur et leurs principales caractéristiques ou apprenez-en plus sur les <a href="/fr/hypotheque/prets-hypothecaires.html">notions de base des prêts hypothécaires</a> pour préparer le financement de votre propriété. Un conseiller ou une conseillère hypothécaire peut aussi vous accompagner dans votre choix.</p></div></div></div></div></div></div></div></div><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-lg cmp-container--main-dsd-pb-40"><div id="container-7370da3715" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="experiencefragment dsd-pl-0 dsd-pr-0 aem-GridColumn aem-GridColumn--default--12"><div id="experiencefragment-231c5a27e8" class="cmp-experiencefragment cmp-experiencefragment--taux-hypothecaires-promotionnels"><div id="container-3c95d50aa6" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-59de7ce039" tabindex="-1"><h2 class="cmp-title__text ">Taux hypothécaires promotionnels</h2></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-va-stretch aem-GridColumn aem-GridColumn--default--12"><div id="container-a15c5f3a5a" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--small--12 aem-Grid--default--12 aem-Grid--xsmall--12 aem-Grid--medium--12 "><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--4"><div id="container-a7a8afb1b6" class="cmp-container cmp-container-improved" style="background-color:#D6EFF2;"><div class="aem-Grid aem-Grid--4 aem-Grid--small--6 aem-Grid--default--4 aem-Grid--xsmall--12 aem-Grid--medium--4 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--column-reverse aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="container-afe57008e6" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--default--4 "><div class="title aem-GridColumn aem-GridColumn--default--4"><div class="cmp-title" id="title-f072ef35c2" tabindex="-1"><h3 class="cmp-title__text dsd-t-6">Prêt fermé à taux fixe sur <span class="dsd-ws-nowrap">4 ans<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-1">2</dsd-footnote-ref></span></span></h3></div></div><div class="text dsd-mt-sm aem-GridColumn aem-GridColumn--default--4"><div id="text-4ef92e754b" class="cmp-text"><p><span class="boa-p-display"><strong><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_4A.rate | taux | 2">4,39 %</span></strong></span><span class="dsd-b-10"> <span class="dsd-sr-only"> au lieu de</span> <span class="dsd-td-line-through"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_4A.rate | taux | 2">6,04 %</span></span> <span class="dsd-sr-only"> avant la promotion</span></span></p></div></div></div></div></div><div class="text dsd-mt-sm aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="text-97e5767694" class="cmp-text"><p>Ce taux reste le même pendant 4 ans.</p></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--4"><div id="container-57fac91a1a" class="cmp-container cmp-container-improved" style="background-color:#D6EFF2;"><div class="aem-Grid aem-Grid--4 aem-Grid--small--6 aem-Grid--default--4 aem-Grid--xsmall--12 aem-Grid--medium--4 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--column-reverse aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="container-7f1d40f04b" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--default--4 "><div class="title aem-GridColumn aem-GridColumn--default--4"><div class="cmp-title" id="title-54ea562131" tabindex="-1"><h3 class="cmp-title__text dsd-t-6">Prêt fermé à taux fixe sur <span class="dsd-ws-nowrap">5 ans<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-2">2</dsd-footnote-ref></span></span></h3></div></div><div class="text dsd-mt-sm aem-GridColumn aem-GridColumn--default--4"><div id="text-e498d6106f" class="cmp-text"><p><span class="boa-p-display"><strong><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_5A.rate | taux | 2">4,49 %</span></strong></span><span class="dsd-b-10"> <span class="dsd-sr-only"> au lieu de</span> <span class="dsd-td-line-through"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_5A.rate | taux | 2">6,09 %</span></span> <span class="dsd-sr-only"> avant la promotion</span></span></p></div></div></div></div></div><div class="text dsd-mt-sm aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="text-f44338255b" class="cmp-text"><p>Ce taux reste le même pendant 5 ans.</p></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--4"><div id="container-4af8662a7c" class="cmp-container cmp-container-improved" style="background-color:#D6EFF2;"><div class="aem-Grid aem-Grid--4 aem-Grid--small--6 aem-Grid--default--4 aem-Grid--xsmall--12 aem-Grid--medium--4 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--column-reverse aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="container-da97fef83d" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--default--4 "><div class="title aem-GridColumn aem-GridColumn--default--4"><div class="cmp-title" id="title-93bfd3ecc9" tabindex="-1"><h3 class="cmp-title__text dsd-t-6">Prêt fermé à taux variable réduit sur <span class="dsd-ws-nowrap">5 ans<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-3">2</dsd-footnote-ref></span></span></h3></div></div><div class="text dsd-mt-sm aem-GridColumn aem-GridColumn--default--4"><div id="text-30bb9aa3d0" class="cmp-text"><p><span class="boa-p-display"><strong><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6004_5AR.rate | taux | 2">4,10 %</span></strong></span><span class="dsd-b-10"> <span class="dsd-sr-only"> au lieu de</span> <span class="dsd-td-line-through"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvred.rate | taux | 2">4,45 %</span></span> <span class="dsd-sr-only"> avant la promotion</span></span></p></div></div></div></div></div><div class="text dsd-mt-sm aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--small--6 aem-GridColumn--default--4"><div id="text-f5354d7805" class="cmp-text"><p>Ce taux varie selon notre taux préférentiel<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/018-taux-preferentiel"><dsd-footnote-ref target="018-taux-preferentiel" id="018-taux-preferentiel-1">3</dsd-footnote-ref></span>, mais toujours avec un écart garanti pendant 5 ans.</p></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-e63b7f8996" class="cmp-container cmp-container-improved" style="background-color:#F4F4F4;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-32 cmp-container--main-dsd-pb-40 aem-GridColumn aem-GridColumn--default--12"><div id="container-b8624b9ba7" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-b5b362543f" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-61009c0d22" class="cmp-container cmp-container-improved" style="" data-mw-element-visible="imp|hypo|taux-hypothecaires|na|Taux fixe"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-c16d532b51" tabindex="-1"><h2 class="cmp-title__text ">Prêts à taux fixe</h2></div></div><div class="text aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="text-bdff95da18" class="cmp-text"><p>Le <strong>taux fixe</strong> reste stable jusqu'à la fin du terme et vous protège contre les variations de notre taux préférentiel. Cette option peut être avantageuse si vous avez une <strong>faible tolérance au risque </strong>et que vous recherchez une grande stabilité.</p></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-46016a3692" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-baa7999d36" tabindex="-1"><h3 class="cmp-title__text ">Prêt fermé à taux fixe</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-d94ea548fa" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-b0022c0232" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>6 mois</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6M.rate | taux | 2">7,99 %</span></td></tr><tr><td>1 an</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1A.rate | taux | 2">5,49 %</span></td></tr><tr><td>2 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_2A.rate | taux | 2">5,59 %</span></td></tr><tr><td>3 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_3A.rate | taux | 2">5,99 %</span></td></tr><tr><td>4 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_4A.rate | taux | 2">6,04 %</span></td></tr><tr><td>4 ans en promotion</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_4A.rate | taux | 2">4,39 %</span><span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-4">2</dsd-footnote-ref></span></td></tr><tr><td>5 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_5A.rate | taux | 2">6,09 %</span></td></tr><tr><td>5 ans en promotion</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6000_5A.rate | taux | 2">4,49 %</span><span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-5">2</dsd-footnote-ref></span></td></tr><tr><td>6 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6A.rate | taux | 2">6,29 %</span></td></tr><tr><td>7 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_7A.rate | taux | 2">6,39 %</span></td></tr><tr><td>10 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_10A.rate | taux | 2">6,89 %</span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ferme-taux-fixe" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only"> du prêt fermé à taux fixe</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only"> du prêt fermé à taux fixe</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt fermé à taux fixe"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-3f2614c719" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-97c9533360" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-9b4a249243" class="cmp-text"><p>Aucune variation de taux durant le terme</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-87f8ef1db7" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypothécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-fa068d5f43" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-1">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-ae8e0aecc1" tabindex="-1"><h4 class="cmp-title__text ">Remboursement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-13a5d2a93f" class="cmp-text"><ul><li>Vous avez l’option de rembourser sans frais d'indemnité jusqu’à 15 % du montant initial de votre prêt par an. Si vous n’utilisez pas ce montant, vous ne pouvez pas le reporter à l’année suivante.</li><li>Vous pouvez aller jusqu'à doubler le montant des paiements prévus à votre contrat initial sans frais d'indemnité.</li></ul><p>Si vous choisissez de verser au-delà de ces montants pour rembourser votre prêt plus vite que prévu, vous devez payer des frais d'indemnité.</p></div></div><div class="action-link custom-mb-24 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-action-link"><a href="https://www.desjardins.com/outils/calcul-indemnite-remboursement/index.jsp" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Estimer les frais d'indemnité hypothécaire </span> </span> </a></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-5898c9e2f1" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-fcda030cc8" class="cmp-text"><ul><li>Vous avez une faible tolérance au risque et aux variations de taux.</li><li>Vous voulez éviter les surprises dans votre budget.</li><li>Vous souhaitez profiter de la régularité des paiements pour réaliser d'autres projets sans risquer de les compromettre.</li><li>Vous pensez conserver votre propriété au moins la durée du terme choisi.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-79f3784e4e" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-dc2acebcd9" tabindex="-1"><h3 class="cmp-title__text ">Prêt ouvert à taux fixe</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-477a43542a" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-009ea80183" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>6 mois</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_6MO.rate | taux | 2">9,75 %</span></td></tr><tr><td>1 an</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/6000_1AO.rate | taux | 2">9,50 %</span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ouvert-taux-fixe" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only"> du prêt ouvert à taux fixe</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only"> du prêt ouvert à taux fixe</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt ouvert à taux fixe"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-c5d420e9e9" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-729af6f9fc" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-46c894c7fd" class="cmp-text"><p>Aucune variation de taux durant le terme</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-2d259c44e0" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypothécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-56b7c2ab12" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-2">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-c058761c57" tabindex="-1"><h4 class="cmp-title__text ">Remboursement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-90f03d2454" class="cmp-text"><p>Vous pouvez rembourser votre prêt au complet ou en partie sans frais d'indemnité et en tout temps. Il arrive cependant que des frais d'indemnité soient exigés si vous profitez de certaines offres et que vous remboursez votre prêt plus vite que prévu.</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-ad9eaf7398" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-0c38efec6c" class="cmp-text"><ul><li>Vous avez une faible tolérance au risque et aux variations de taux.</li><li>Vous voulez éviter les surprises dans votre budget.</li><li>Vous allez recevoir un montant d'argent et vous voulez vous en servir pour rembourser votre prêt sans payer de frais d'indemnité.</li><li>Vous planifiez vendre votre propriété ou rembourser la totalité de votre prêt à court terme.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="separator custom-mt-32 custom-mb-32 aem-GridColumn aem-GridColumn--default--12"><div id="separator-c58da3cdb2" class="cmp-separator"><hr class="cmp-separator__horizontal-rule"></div></div></div></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-974cbd152a" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-1c4714ac3a" tabindex="-1"><h2 class="cmp-title__text ">Prêts à taux variable</h2></div></div><div class="text aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="text-a730af3143" class="cmp-text"><p>Le <strong>taux variable </strong>augmente ou diminue selon les fluctuations de notre taux préférentiel. Cette option peut être intéressante si vous avez une <strong>bonne tolérance au risque</strong> et que vous voulez profiter des possibles baisses de taux pour économiser sur les intérêts.</p></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-25f303cacc" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-4f4c16e85d" tabindex="-1"><h3 class="cmp-title__text ">Prêt fermé à taux variable réduit</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-dda951b0e1" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-9732434a16" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>5 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvred.rate | taux | 2">4,45 %</span></td></tr><tr><td>5 ans en promotion</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires-promotionnels/6004_5AR.rate | taux | 2">4,10 %</span><span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/005-taux-promo-conditions"><dsd-footnote-ref target="005-taux-promo-conditions" id="005-taux-promo-conditions-6">2</dsd-footnote-ref></span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ferme-taux-variable-reduit" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only"> du prêt fermé à taux variable réduit</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only"> du prêt fermé à taux variable réduit</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt fermé à taux variable réduit"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-5ee2f2a4e7" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-675b97829c" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-6ac74e637c" class="cmp-text"><p>Votre taux est basé sur notre taux préférentiel plus ou moins un écart garanti tout au long du terme. Votre taux peut donc augmenter ou diminuer à chaque variation de notre taux préférentiel.</p><p>Vous pouvez convertir votre taux variable réduit en taux fixe à tout moment, sans frais d'indemnité et à certaines conditions.</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-5f4567bd33" tabindex="-1"><h5 class="cmp-title__text ">Exemples</h5></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-5da0de9ed3" class="cmp-text"><p>Écart garanti : -0,70 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-174872eba5" tabindex="-1"><h6 class="cmp-title__text ">Variation 1</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-b7d429dbe2" class="cmp-text"><p>Taux préférentiel : 6,75 %<br></p><p>Taux personnalisé : 6,05 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-61ef36122b" tabindex="-1"><h6 class="cmp-title__text ">Variation 2</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-c87603acd3" class="cmp-text"><p>Taux préférentiel : 6,95 %<br></p><p>Taux personnalisé : 6,25 %</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-ebca627cbb" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypothécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-faaf99753b" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-3">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-bc9a5b8d96" tabindex="-1"><h4 class="cmp-title__text ">Remboursement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-200b6752ce" class="cmp-text"><ul><li>Vous avez l’option de rembourser sans frais d'indemnité jusqu’à 15 % du montant initial de votre prêt par an. Si vous n’utilisez pas ce montant, vous ne pouvez pas le reporter à l’année suivante.</li><li>Vous pouvez aller jusqu'à doubler le montant des paiements prévus à votre contrat initial sans frais d'indemnité.</li></ul><p>Si vous choisissez de verser au-delà de ces montants pour rembourser votre prêt plus vite que prévu, vous devez payer des frais d'indemnité.</p></div></div><div class="action-link custom-mb-24 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-action-link"><a href="https://www.desjardins.com/outils/calcul-indemnite-remboursement/index.jsp" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Estimer les frais d'indemnité hypothécaire </span> </span> </a></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-ae6769b977" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-199a9691a9" class="cmp-text"><ul><li>Vous pouvez tolérer d'importantes variations de taux et votre budget est flexible.</li><li>Vous avez un niveau élevé de connaissances financières.</li><li>Vous souhaitez payer le moins d'intérêts possible et optimiser le remboursement de votre prêt lorsque les taux baissent.<br></li><li>Vous pensez conserver votre propriété au moins 5 ans.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-41347d2608" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-16c6c72d63" tabindex="-1"><h3 class="cmp-title__text ">Prêt fermé à taux variable protégé</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-62d547bd3c" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-260070e94c" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>5 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvp.rate | taux | 2">4,70 %</span></td></tr></tbody></table></div> </dsd-table></div><div class="text custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div id="text-02bdf6d286" class="cmp-text"><p>Taux maximum : <span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tptvp.rate | taux | 2">7,54 %</span></p></div></div><div class="extensible-panel responsivegrid negative-margins-cancelling aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ferme-taux-variable-protege" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only"> du prêt fermé à taux variable protégé</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only"> du prêt fermé à taux variable protégé</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt fermé à taux variable protégé"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-282f4fcfcb" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-4d7428cc5c" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-0621d6702a" class="cmp-text"><p>Votre taux est basé sur notre taux préférentiel plus ou moins un écart garanti tout au long du terme. Il est protégé par un taux maximum fixé quand vous signez votre prêt. Votre taux peut donc augmenter ou diminuer à chaque variation de notre taux préférentiel, mais il ne dépassera jamais le taux maximum.</p><p>Vous pouvez convertir votre taux variable protégé en taux fixe à tout moment, sans frais d'indemnité et à certaines conditions.</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-b4953cda99" tabindex="-1"><h5 class="cmp-title__text ">Exemples</h5></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-f570e14a1f" class="cmp-text"><p>Écart garanti : -0,60 %<br> Taux maximum : 6,29 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-1a937ab28c" tabindex="-1"><h6 class="cmp-title__text ">Variation 1</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-91493c282c" class="cmp-text"><p>Taux préférentiel : 5,45 %<br></p><p>Taux personnalisé : 4,85 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-eea224f5f0" tabindex="-1"><h6 class="cmp-title__text ">Variation 2</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-7929d4b6db" class="cmp-text"><p>Taux préférentiel : 6,45 %<br></p><p>Taux personnalisé : 5,85 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-42c932a089" tabindex="-1"><h6 class="cmp-title__text ">Variation 3</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-31b6224746" class="cmp-text"><p>Taux préférentiel : 7,45 %<br></p><p>Taux personnalisé : 6,29 % au lieu de 6,85 % puisque votre taux est protégé par le taux maximum</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-cd87b9871a" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypothécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-9b54e18e71" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-4">4</dsd-footnote-ref></span></p><p>Le montant des paiements est calculé selon le taux maximum. Si votre taux personnalisé est inférieur au taux maximum, la différence paye votre capital. Plus la différence est élevée, plus vous remboursez votre capital rapidement.</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-cdc3ac36be" tabindex="-1"><h4 class="cmp-title__text ">Remboursement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-d511041817" class="cmp-text"><ul><li>Vous avez l’option de rembourser sans frais d'indemnité jusqu’à 15 % du montant initial de votre prêt par an. Si vous n’utilisez pas ce montant, vous ne pouvez pas le reporter à l’année suivante.</li><li>Vous pouvez aller jusqu'à doubler le montant des paiements prévus à votre contrat initial sans frais d'indemnité.</li></ul><p>Si vous choisissez de verser au-delà de ces montants pour rembourser votre prêt plus vite que prévu, vous devez payer des frais d'indemnité.</p></div></div><div class="action-link custom-mb-24 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-action-link"><a href="https://www.desjardins.com/outils/calcul-indemnite-remboursement/index.jsp" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Estimer les frais d'indemnité hypothécaire </span> </span> </a></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-dde572ad32" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-9d31f6431e" class="cmp-text"><ul><li>Vous avez une certaine tolérance au risque, mais vous voulez garder le contrôle de votre budget.</li><li>Vous connaissez le taux maximum et le montant de vos paiements dès la signature de votre prêt.</li><li>Vous voulez profiter des baisses de taux pour payer votre capital plus vite tout en vous protégeant lors de hausses importantes.<br></li><li>Vous pensez conserver votre propriété au moins 5 ans.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-8906c15709" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-845ede4db4" tabindex="-1"><h3 class="cmp-title__text ">Prêt ouvert à taux variable régulier</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-75ed738bf6" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-6d8b03ab00" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>1 an</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg.rate | taux | 2">5,70 %</span></td></tr><tr><td>2 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tvreg2.rate | taux | 2">5,70 %</span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ouvert-taux-variable-regulier" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only"> du prêt ouvert à taux variable régulier</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only"> du prêt ouvert à taux variable régulier</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt ouvert à taux variable régulier"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-52a42f5d46" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-e0bb75b10b" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-ecfc38a206" class="cmp-text"><p>Votre taux est basé sur notre taux préférentiel plus ou moins un écart garanti tout au long du terme. Votre taux peut donc augmenter ou diminuer à chaque variation de notre taux préférentiel.</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-9891efe340" tabindex="-1"><h5 class="cmp-title__text ">Exemples</h5></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-85823463ac" class="cmp-text"><p>Écart garanti : -0,70 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-5f3151f62f" tabindex="-1"><h6 class="cmp-title__text ">Variation 1</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-c79fffa42d" class="cmp-text"><p>Taux préférentiel : 6,75 %<br></p><p>Taux personnalisé : 6,05 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-889bfc5800" tabindex="-1"><h6 class="cmp-title__text ">Variation 2</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-f31fb1785a" class="cmp-text"><p>Taux préférentiel : 6,95 %<br></p><p>Taux personnalisé : 6,25 %</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-562b28e765" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypothécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-1c5876f40a" class="cmp-text"><p>Égaux jusqu'à la fin du terme<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-5">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-bbdf49d3fa" tabindex="-1"><h4 class="cmp-title__text ">Remboursement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-b2ead72d72" class="cmp-text"><p>Vous pouvez rembourser votre prêt au complet ou en partie sans frais d'indemnité et en tout temps. Il arrive cependant que des frais d'indemnité soient exigés si vous profitez de certaines offres et que vous remboursez votre prêt plus vite que prévu.</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-6ebefeea45" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-3d409fe732" class="cmp-text"><ul><li>Vous pouvez tolérer d'importantes variations de taux et votre budget est flexible.</li><li>Vous avez un niveau élevé de connaissances financières.</li><li>Vous planifiez vendre votre propriété ou rembourser la totalité de votre prêt à court terme.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div><div class="separator custom-mt-32 custom-mb-32 aem-GridColumn aem-GridColumn--default--12"><div id="separator-7380b9075d" class="cmp-separator"><hr class="cmp-separator__horizontal-rule"></div></div></div></div></div></div></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-7c5852ff25" class="cmp-container cmp-container-improved" style="" data-mw-element-visible="imp|hypo|taux-hypothecaires|na|Taux revisable"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-08c6cb5fcf" tabindex="-1"><h2 class="cmp-title__text ">Prêt à taux révisable annuellement</h2></div></div><div class="text aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="text-5acd498682" class="cmp-text"><p>Le <strong>taux révisable annuellement</strong> est ajusté chaque année en fonction de notre prêt fermé à taux fixe sur 1 an moins un écart. Cette option peut vous convenir si vous avez une <strong>certaine tolérance au risque</strong> et que vous avez la flexibilité financière de faire face à des possibles hausses annuelles.</p></div></div><div class="container responsivegrid cmp-container--main-cb-md cmp-container--main-custom-mt-24 cmp-container--main-cp-md aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-b26a4ce3a9" class="cmp-container cmp-container-improved" style="background-color:#ffffff;"><div class="aem-Grid aem-Grid--10 aem-Grid--small--10 aem-Grid--default--10 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-3630a71a7a" tabindex="-1"><h3 class="cmp-title__text ">Prêt fermé à taux révisable annuellement</h3></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-8440886370" tabindex="-1"><h4 class="cmp-title__text ">Taux d'intérêt selon le terme</h4></div></div><div class="table-dsd text first-row-header dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--small--8 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><dsd-table><div id="table-dsd-aa04f0ddb0" class="cmp-text"><table cellpadding="1" cellspacing="0" border="0"><tbody><tr><th scope="col">Terme</th><th style=" text-align: right;" scope="col">Taux d’intérêt</th></tr><tr><td>5 ans</td><td style=" text-align: right;"><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tra.rate | taux | 2">5,49 %</span></td></tr></tbody></table></div> </dsd-table></div><div class="extensible-panel responsivegrid negative-margins-cancelling custom-mt-24 aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-extensible-panel"><button id="pret-ferme-taux-revisable-annuellement" class="cmp-extensible-panel-header" aria-expanded="false"> <span class="cmp-extensible-panel-header__closed-text">Afficher le détail<span class="dsd-sr-only"> du prêt fermé à taux révisable annuellement</span></span> <span class="cmp-extensible-panel-header__opened-text">Masquer le détail<span class="dsd-sr-only"> du prêt fermé à taux révisable annuellement</span></span> </button><section class="cmp-extensible-panel-body " style="--extensiblePanelBgColor: #ffffff;" aria-label="Prêt fermé à taux révisable annuellement"><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-cp-md aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div id="container-59adbcb4e9" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--10 aem-Grid--default--10 "><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-6f876c251b" tabindex="-1"><h4 class="cmp-title__text ">Variation du taux</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-6a8563c1df" class="cmp-text"><p>Votre taux correspond à celui de notre prêt fermé à taux fixe sur 1 an moins un écart garanti. Le pourcentage de cet écart est connu pour chaque année du terme. Votre taux est révisé une fois par an, à la date anniversaire du prêt.</p><p>Vous pouvez convertir votre taux révisable annuellement en taux fixe à tout moment, sans frais d'indemnité et à certaines conditions.</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-d841899752" tabindex="-1"><h5 class="cmp-title__text ">Exemples</h5></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-2c57eb3f62" class="cmp-text"><p>Écart garanti : -0,20 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-57856e8b8e" tabindex="-1"><h6 class="cmp-title__text ">Année 1</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-460321f5ab" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1 an : 6,99 %<br></p><p>Taux personnalisé : 6,79 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-3985ca04f2" tabindex="-1"><h6 class="cmp-title__text ">Année 2</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-9980379742" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1 an : 6,99 %<br></p><p>Taux personnalisé : 6,79 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-046208a8e4" tabindex="-1"><h6 class="cmp-title__text ">Année 3</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-1638de85f1" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1 an : 6,24 %<br></p><p>Taux personnalisé : 6,04 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-be7f983760" tabindex="-1"><h6 class="cmp-title__text ">Année 4</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-ca7c02fe39" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1 an : 6,74 %<br></p><p>Taux personnalisé : 6,54 %</p></div></div><div class="title aem-GridColumn aem-GridColumn--default--10"><div class="cmp-title" id="title-126af88da9" tabindex="-1"><h6 class="cmp-title__text ">Année 5</h6></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-d7254c87aa" class="cmp-text"><p>Taux du prêt fermé à taux fixe sur 1 an : 6,49 %<br></p><p>Taux personnalisé : 6,29 %</p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-f5fb7e6426" tabindex="-1"><h4 class="cmp-title__text ">Paiements hypothécaires</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-91b85a7ea9" class="cmp-text"><p>Égaux pendant 12 mois et ajustés chaque année selon votre nouveau taux<span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/025-paiements-modifies"><dsd-footnote-ref target="025-paiements-modifies" id="025-paiements-modifies-6">4</dsd-footnote-ref></span></p></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-357e4107f8" tabindex="-1"><h4 class="cmp-title__text ">Remboursement anticipé</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-4b9eef1281" class="cmp-text"><ul><li>Vous avez l’option de rembourser sans frais d'indemnité jusqu’à 15 % du montant initial de votre prêt par an. Si vous n’utilisez pas ce montant, vous ne pouvez pas le reporter à l’année suivante.</li><li>Vous pouvez aller jusqu'à doubler le montant des paiements prévus à votre contrat initial sans frais d'indemnité.</li></ul><p>Si vous choisissez de verser au-delà de ces montants pour rembourser votre prêt plus vite que prévu, vous devez payer des frais d'indemnité.</p></div></div><div class="action-link custom-mb-24 aem-GridColumn aem-GridColumn--default--10"><div class="cmp-action-link"><a href="https://www.desjardins.com/outils/calcul-indemnite-remboursement/index.jsp" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Estimer les frais d'indemnité hypothécaire </span> </span> </a></div></div><div class="title aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-95c75f27d1" tabindex="-1"><h4 class="cmp-title__text ">Pourquoi le choisir?</h4></div></div><div class="text aem-GridColumn aem-GridColumn--default--10"><div id="text-deab148853" class="cmp-text"><ul><li>Vous avez une certaine tolérance au risque, mais vous cherchez une prévisibilité à court terme dans votre budget.</li><li>Vous connaissez le taux et le montant de vos paiements sur une base annuelle.</li><li>Vous voulez profiter des potentielles baisses de taux sans vous exposer pleinement aux risques d'un taux variable.<br></li><li>Vous pensez conserver votre propriété au moins 5 ans.</li></ul></div></div></div></div></div></div></section></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-5c2a61d777" class="cmp-container cmp-container-improved" style="background-color:#ECF5F0;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-24 cmp-container--main-custom-mb-24 cmp-container--main-dsd-pt-24 cmp-container--main-dsd-pb-24 cmp-container--main-va-center aem-GridColumn aem-GridColumn--default--12"><div id="taux-preferentiel" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="image aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><div data-cmp-is="image" data-cmp-lazy data-cmp-lazythreshold="0" data-cmp-src="/fr/hypotheque/taux-hypothecaires/_jcr_content/root/container/container/container_1823686747/container_1674456545/image.coreimg.85{.width}.png/1677699008335/taux-preferentiel.png" data-cmp-widths="320,480,600,800,1024,1200,1600" data-asset="/content/dam/images/photos/particuliers/hypotheque/taux preferentiel.png" class="cmp-image image-p-0 image-m-0"><noscript data-cmp-hook-image="noscript"><img class="cmp-image__image image-br-md" src="/fr/hypotheque/taux-hypothecaires/_jcr_content/root/container/container/container_1823686747/container_1674456545/image.coreimg.png/1677699008335/taux-preferentiel.png" style="--image-translate: %; --image-translate-mob: %" alt data-cmp-hook-image="image"></noscript></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-custom-mt-32 cmp-container--main-custom-mb-32 aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--6 aem-GridColumn--offset--default--0"><div id="container-1ef00051d5" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--6 aem-Grid--default--6 aem-Grid--xsmall--12 "><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-title" id="title-a49114274e" tabindex="-1"><h2 class="cmp-title__text ">Taux préférentiel</h2></div></div><div class="text aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div id="text-8449b2d7f6" class="cmp-text"><p><span class="dsd-b-10"><strong><span data-token="prcf:/content/dam/content-fragment/fr/produits/hypotheque/taux-hypothecaires/tpcad.rate | taux | 2">4,45 %</span><span data-footnote-token="fnote:/content/dam/content-fragment/fr/notes-legales/hypotheque/018-taux-preferentiel"><dsd-footnote-ref target="018-taux-preferentiel" id="018-taux-preferentiel-2">3</dsd-footnote-ref></span></strong></span><br></p></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-title" id="title-72be5a4af7" tabindex="-1"><h3 class="cmp-title__text ">Qu'est-ce que le taux préférentiel?</h3></div></div><div class="text aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div id="text-42d354ea06" class="cmp-text"><p>C'est le taux que nous utilisons pour fixer les taux d'intérêt de plusieurs de nos prêts et marges de crédit. Comme celui des autres institutions financières, notre taux préférentiel se base sur le taux directeur de la Banque du Canada. Quand le taux directeur augmente ou baisse, notre taux préférentiel suit généralement et influence ensuite les taux de certains de nos produits financiers.</p></div></div><div class="title dsd-mt-lg aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-title" id="title-b60de3f416" tabindex="-1"><h2 class="cmp-title__text ">Taux d'intérêt de la marge Atout</h2></div></div><div class="text aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div id="text-58bf0595f3" class="cmp-text"><p>Le taux d'intérêt des prêts liés à votre marge, comme celui associé à votre propriété, est établi selon les conditions décidées au moment de créer le prêt.</p><p>Le taux d'intérêt variable de la marge de crédit hypothécaire est fixé en fonction de notre taux préférentiel plus ou moins un écart de base. Cet écart est ensuite personnalisé selon plusieurs critères, comme votre profil financier ou votre projet.</p></div></div><div class="title aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-title" id="title-849abb5bc5" tabindex="-1"><h3 class="cmp-title__text dsd-t-6">Exemple</h3></div></div><div class="text aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div id="text-6d51f26d6e" class="cmp-text"><p>Taux préférentiel : 6,70 %<br> Taux de la marge avec l'écart de base : 7,70 %<br> Taux personnalisé après évaluation du dossier : 7,30 %</p></div></div><div class="action-link dsd-mt-lg aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--6"><div class="cmp-action-link"><a href="/fr/hypotheque/marge-atout.html" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Découvrir la marge Atout </span> </span> </a></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-be3542b33e" class="cmp-container cmp-container-improved" style="background-color:#CCE7D7;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-40 cmp-container--main-dsd-pb-32 cmp-container--main-va-stretch aem-GridColumn aem-GridColumn--default--12"><div id="container-3d7cb5e087" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="experiencefragment dsd-pl-0 dsd-pr-0 aem-GridColumn aem-GridColumn--default--12"><div id="experiencefragment-ad71b8fe46" class="cmp-experiencefragment cmp-experiencefragment--calculateurs-hypothecaires"><div id="container-3556430b20" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="icon-dsd aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><dsd-icon icon-name="contenus_contour_calculateur" fill="light-confirmation-4" size="xl"> </dsd-icon></div><div class="title dsd-mt-lg dsd-mb-sm aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-1b62dc47a9" tabindex="-1"><h2 class="cmp-title__text ">Calculateurs hypothécaires</h2></div></div><div class="semantic-list accordion panelcontainer grid-flow grid-flow--2up aem-GridColumn--default--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-semantic-list" id="semantic-list-c463575761" data-panelcontainer="false"><ul class="cmp-semantic-list__unordered-list grid-flow__container"><li class="cmp-semantic-list__item grid-flow__child"><div class="tile responsivegrid"><a href="https://www.desjardins.com/outils/valeur-maison/index.jsp#/valeur-maison" class="tile-center tile-pale "><div class="aem-Grid aem-Grid--5 aem-Grid--default--5 aem-Grid--xsmall--12 "><div class="text dsd-mt-lg aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--5"><div id="text-5c783c9344" class="cmp-text"><p>Calculez combien vous pouvez emprunter</p></div></div></div><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </a></div></li><li class="cmp-semantic-list__item grid-flow__child"><div class="tile responsivegrid"><a href="https://www.desjardins.com/outils/calcul-versements-hypothecaires/index.jsp" class="tile-center tile-pale "><div class="aem-Grid aem-Grid--5 aem-Grid--default--5 aem-Grid--xsmall--12 "><div class="text dsd-mt-lg aem-GridColumn--xsmall--12 aem-GridColumn aem-GridColumn--default--5"><div id="text-4fb1d9fbeb" class="cmp-text"><p>Calculez et optimisez vos paiements hypothécaires</p></div></div></div><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </a></div></li></ul></div></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-c9bc1c628e" class="cmp-container cmp-container-improved" style="background-color:#f2f2f2;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-32 cmp-container--main-dsd-pb-40 aem-GridColumn aem-GridColumn--default--12"><div id="container-ff9402e2e0" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit aem-GridColumn aem-GridColumn--default--12"><div id="container-36221c373d" class="cmp-container cmp-container-improved" style="" data-mw-element-visible="imp|hypo|taux-hypothecaires|na|Faq"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title dsd-mb-lg aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-163861b25a" tabindex="-1"><h2 class="cmp-title__text ">Foire aux questions</h2></div></div><div class="faq dsd-mb-lg aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-faq"><dsd-accordion class="cmp-accordion-dsd"><h3 slot="title">Pourquoi les taux hypothécaires augmentent-ils?</h3><p>La variation à la hausse ou à la baisse des taux hypothécaires dépend principalement du taux directeur établi par la Banque du Canada. Le taux directeur fluctue selon la situation économique au Canada et à l'étranger. Son rôle est de réguler l'inflation en fonction de la croissance économique. Une hausse du taux directeur, et donc des taux hypothécaires, sert à ralentir l'inflation, à stimuler l'épargne et à stabiliser le cycle économique.</p><p>Pour en savoir plus, lisez l'article <a href="/fr/conseils/taux-hypothecaires-4-questions-reponses.html">Hausse des taux hypothécaires : 4 questions et leurs réponses</a>.</p> </dsd-accordion> <dsd-accordion class="cmp-accordion-dsd"><h3 slot="title">Pourquoi réserver mon taux hypothécaire?</h3><p>Réserver votre taux hypothécaire vous permet de vous protéger en cas de hausse des taux pendant vos démarches d'achat de propriété. Nous fixons votre taux en fonction de votre dossier et la durée pour laquelle il est garanti selon votre projet et vos besoins. Pour que votre taux reste garanti, votre dossier et les paramètres de votre financement doivent rester les mêmes durant la période convenue. Sinon, votre garantie de taux pourrait devoir être réévaluée en fonction des derniers taux en vigueur.</p><p>Contactez-nous pour en savoir plus ou réserver votre taux.</p> </dsd-accordion> <dsd-accordion class="cmp-accordion-dsd"><h3 slot="title">Comment puis-je me protéger en cas de hausse des taux d'intérêt hypothécaires?</h3><p>Dès le début de vos démarches d'achat de maison, pensez à demander une préautorisation pour garantir votre taux. Évaluez aussi les incidences qu'une augmentation des taux d'intérêt aurait dans votre budget. Même si nous vérifions votre capacité à rembourser votre prêt à un taux plus élevé que celui proposé, votre situation financière peut changer au fil du temps. Assurez-vous donc d'avoir une marge de manœuvre suffisante et de mettre de l'argent de côté dans un <a href="https://www.desjardins.com/particuliers/comptes-services-relies/comptes-epargne/">compte d'épargne</a>.</p> </dsd-accordion> <dsd-accordion class="cmp-accordion-dsd"><h3 slot="title">J'ai un prêt chez Desjardins. Où puis-je consulter mon taux hypothécaire actuel?</h3><p>Vous pouvez vérifier votre taux actuel et voir d'autres détails sur votre prêt hypothécaire dans AccèsD.</p><p><b>Dans un navigateur Web</b></p><ol><li>Connectez-vous à <a href="https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification/auth/manuel?domaineVirtuel=desjardins&langueCible=fr&executeTime=24">AccèsD</a>.</li><li>Sous <b>Cartes, prêts et marges de crédit</b>, choisissez le compte <b>Prêt hypothécaire résidentiel.</b></li><li>Ouvrez le tiroir <b>Information sur le compte</b> pour consulter votre taux hypothécaire et d'autres détails.</li></ol><p><b><br> Dans l'appli Services mobiles Desjardins</b></p><ol><li>Connectez-vous à <a href="https://accweb.mouv.desjardins.com/identifiantunique/securite-garantie/authentification/auth/manuel?domaineVirtuel=desjardins&langueCible=fr&executeTime=24">AccèsD</a>.</li><li>Sous <b>Accès rapide</b>, choisissez <b>Mes comptes</b>.</li><li>Sous <b>Cartes, prêts et marges de crédit</b>, sélectionnez le compte associé à votre prêt hypothécaire résidentiel.</li><li>Sélectionnez <b>Information</b>.</li><li>Consultez le <b>Taux d'intérêt annuel en vigueur</b>.</li></ol> </dsd-accordion></div></div><div class="action-link aem-GridColumn aem-GridColumn--default--12"><div class="cmp-action-link"><a href="/fr/hypotheque/faq.html" class="link-action link-action-green "> <span class="mask-button-states"> <span class="icon"><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </span> <span class="cmp-action-link__label">Voir plus de questions sur l'hypothèque </span> </span> </a></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-custom-mt-40 cmp-container--main-custom-mb-40 cmp-container--main-dsd-pt-32 cmp-container--main-dsd-pb-lg"><div id="at-0043-bloc-conversion" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="msm-experiencefragment experiencefragment dsd-pl-0 dsd-pr-0 aem-GridColumn aem-GridColumn--default--12"><div id="msm-experiencefragment-68d9822a65" class="cmp-experiencefragment cmp-experiencefragment--contactez-nous-preautorisation"><div id="container-1ee8446a39" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--small--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title aem-GridColumn aem-GridColumn--default--12"><div class="cmp-title" id="title-b7bd5e42c9" tabindex="-1"><h2 class="cmp-title__text ">Demandez une préautorisation hypothécaire</h2></div></div><div class="separator dsd-mb-sm aem-GridColumn aem-GridColumn--default--12"><div id="separator-12c88996a5" class="cmp-separator"><hr class="cmp-separator__horizontal-rule" aria-hidden="true" role="none"></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-custom-mt-24 cmp-container--main-custom-mb-24 cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--offset--default--0 aem-GridColumn--default--4"><div id="container-f1d836ac95" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--small--10 aem-Grid--default--4 aem-Grid--xsmall--12 "><div class="icon-dsd aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><dsd-icon icon-name="contenus_contour_en_ligne" fill="light-primary-4" size="xl"> </dsd-icon></div><div class="title dsd-mt-lg aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-de007fbfe7" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">En ligne<br></h3></div></div><div class="text aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-06bb0c523a" class="cmp-text"><p>Si vous êtes membre, demandez une préautorisation de façon autonome.</p></div></div><div class="action-link dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-action-link"><a href="https://accesdc.mouv.desjardins.com/services/navigation/aiguillage/mon-toit" class="link-principal link-principal-green " data-mw-action-clic="iaw|hypo|bloc demandez une preautorisation|bas|demander une preautorisation"> <span class="mask-button-states"> <span class="cmp-action-link__label">Demander une préautorisation<span class="dsd-sr-only"> hypothécaire dans nos services mobiles et en ligne.</span> </span> </span> </a></div></div></div></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-custom-mt-24 cmp-container--main-custom-mb-24 cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--offset--default--0 aem-GridColumn--default--4"><div id="container-d50b5d98f4" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--small--10 aem-Grid--default--4 aem-Grid--xsmall--12 "><div class="icon-dsd aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><dsd-icon icon-name="contenus_contour_par_telephone" fill="light-primary-4" size="xl"> </dsd-icon></div><div class="title dsd-mt-lg aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-29dc628b4d" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">Par téléphone</h3></div></div><div class="text aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-d74aeba8d7" class="cmp-text"><p>Prenez rendez-vous pour votre demande de préautorisation.</p></div></div><div class="text dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-1b04912587" class="cmp-text"><p>Lundi au vendredi : 8 h à 21 h<br> Samedi : 9 h à 18 h</p></div></div><div class="text dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-afbe42b1e6" class="cmp-text"><p>Région de Montréal :<br> <span class="dsd-b-10"><strong><a href="tel:5147459499" class="dsd-c-light-confirmation-5">514 745-9499<span class="dsd-sr-only"> Ce lien ouvre votre application de téléphonie.</span></a></strong></span></p></div></div><div class="text dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-ad09e46895" class="cmp-text"><p>Ailleurs au Canada :<br> <span class="dsd-b-10"><strong><a href="tel:18446262476" class="dsd-c-light-confirmation-5">1 844 626-2476<span class="dsd-sr-only"> Ce lien ouvre votre application de téléphonie.</span></a></strong></span></p></div></div><div class="text dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-1bad9411b7" class="cmp-text"><p>Pour éviter l’attente, vous pouvez <a href="https://rappel.desjardins.com/#/dcom-pleine-page?struct=%5B%22VPA%22,%22DPCCCSC%22,%22Financement%22%5D&dest=FIN_Hypotheque_Clic&da=P" data-mw-action-clic="iat|hypo|bloc demandez une preautorisation|bas|planifier un appel">planifier un appel</a>.</p></div></div></div></div></div><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-custom-mt-24 cmp-container--main-custom-mb-24 cmp-container--main-va-flex-start aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--offset--default--0 aem-GridColumn--default--4"><div id="container-ca2aff95c6" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--4 aem-Grid--small--10 aem-Grid--default--4 aem-Grid--xsmall--12 "><div class="icon-dsd aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><dsd-icon icon-name="contenus_contour_conseiller" fill="light-primary-4" size="xl"> </dsd-icon></div><div class="title dsd-mt-lg aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-4f8395306f" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">Avec un conseiller ou une conseillère</h3></div></div><div class="text aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div id="text-2271d5293b" class="cmp-text"><p>Si vous êtes membre, utilisez nos services mobiles et en ligne pour prendre un rendez-vous en personne, par téléphone ou par vidéo.</p></div></div><div class="action-link dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--small--10 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--3 aem-GridColumn--offset--default--0"><div class="cmp-action-link"><a href="https://accesdc.mouv.desjardins.com/services/navigation/aiguillage/prise-rendez-vous" class="link-secondary link-secondary-green " data-mw-action-clic="ias|hypo|bloc demandez une preautorisation|bas|prendre rendez vous"> <span class="mask-button-states"> <span class="cmp-action-link__label">Prendre rendez-vous<span class="dsd-sr-only"> dans nos services mobiles et en ligne.</span> </span> </span> </a></div></div></div></div></div></div></div></div></div></div></div></div><div class="container responsivegrid"><div id="container-51f51c993f" class="cmp-container cmp-container-improved" style="background-color:#f4f4f4;"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-grid-full cmp-container--main-dsd-pt-32 cmp-container--main-dsd-pb-32 aem-GridColumn aem-GridColumn--default--12"><div id="container-791ad82872" class="cmp-container cmp-container-improved" style="background-color:rgba(255,255,255,0);"><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="container responsivegrid cmp-container--main-retrait-gutter-gauche cmp-container--main-retrait-gutter-droit cmp-container--main-dsd-mb-sm cmp-container--main-va-stretch aem-GridColumn aem-GridColumn--default--12"><div id="container-5fb3234cb5" class="cmp-container cmp-container-improved" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--small--12 aem-Grid--default--12 aem-Grid--xsmall--12 "><div class="title custom-mt-40 aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--default--10 aem-GridColumn--offset--default--0"><div class="cmp-title" id="title-acfb02f06e" tabindex="-1"><h2 class="cmp-title__text ">Obtenez d'autres informations utiles</h2></div></div><div class="tile responsivegrid aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0 aem-GridColumn--small--6"><a href="/fr/hypotheque/preautorisation-hypothecaire.html" class="tile-center tile-pale "><div class="aem-Grid aem-Grid--6 aem-Grid--small--6 aem-Grid--default--6 aem-Grid--xsmall--12 aem-Grid--medium--6 "><div class="title dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6"><div class="cmp-title" id="title-f4918c858c" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">Préautorisation hypothécaire</h3></div></div></div><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </a></div><div class="tile responsivegrid aem-GridColumn--small--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--default--none aem-GridColumn--xsmall--12 aem-GridColumn--xsmall--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6 aem-GridColumn--offset--default--0 aem-GridColumn--small--6"><a href="/fr/hypotheque/renouvellement-hypothecaire.html" class="tile-center tile-pale "><div class="aem-Grid aem-Grid--6 aem-Grid--small--6 aem-Grid--default--6 aem-Grid--xsmall--12 aem-Grid--large--6 aem-Grid--medium--6 "><div class="title dsd-mt-sm aem-GridColumn--small--none aem-GridColumn--medium--none aem-GridColumn--offset--xsmall--0 aem-GridColumn--offset--large--0 aem-GridColumn--default--none aem-GridColumn--medium--4 aem-GridColumn--xsmall--12 aem-GridColumn--offset--default--0 aem-GridColumn--small--6 aem-GridColumn--offset--medium--0 aem-GridColumn--large--4 aem-GridColumn--xsmall--none aem-GridColumn--large--none aem-GridColumn aem-GridColumn--offset--small--0 aem-GridColumn--default--6"><div class="cmp-title" id="title-e6282c5919" tabindex="-1"><h3 class="cmp-title__text dsd-t-4">Renouvellement de votre prêt</h3></div></div></div><svg class="arrow" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M20.704 11.29l-5.998-5.996a1.004 1.004 0 00-1.42 1.419l4.3 4.287H4a1 1 0 100 1.998h13.585l-4.298 4.287a1 1 0 000 1.42 1 1 0 001.42 0l5.997-5.996a1 1 0 000-1.42z" fill-rule="evenodd" /></svg> </a></div></div></div></div><div class="footnotes-dsd aem-GridColumn aem-GridColumn--default--12"><dsd-footnote-group class="cmp-footnotes-dsd" slot="list" footnote-group-title="Notes"><div slot="list"><dsd-footnote list-type="decimal" id="002-note-generale-taux-hypotheque" return-id="002-note-generale-taux-hypotheque-1">Ces taux peuvent être modifiés sans préavis. À moins d’indication contraire, ils peuvent être personnalisés et varier à la baisse ou à la hausse selon plusieurs critères, comme votre profil financier ou encore votre projet.<br><br> Les taux peuvent différer si l'amortissement de votre prêt hypothécaire est supérieur à 25 ans. Contactez un conseiller ou une conseillère pour plus d'information.<br><br> Ces taux d'intérêt sont recommandés par la Fédération des caisses Desjardins du Québec à l'ensemble de ses caisses.</dsd-footnote><dsd-footnote list-type="decimal" id="005-taux-promo-conditions" return-id="005-taux-promo-conditions-1">Vous devez remplir les conditions applicables pour bénéficier de la promotion.</dsd-footnote><dsd-footnote list-type="decimal" id="018-taux-preferentiel" return-id="018-taux-preferentiel-1">Le taux préférentiel Desjardins était anciennement appelé le taux préférentiel de la Caisse centrale Desjardins.</dsd-footnote><dsd-footnote list-type="decimal" id="025-paiements-modifies" return-id="025-paiements-modifies-1">Vos paiements pourraient être modifiés dans certaines situations prévues à votre contrat.</dsd-footnote></div></dsd-footnote-group></div></div></div></div></div></div></div></div></div></div></div></main><footer class="msm-experiencefragment experiencefragment"><div id="msm-experiencefragment-ba829dffd6" class="cmp-experiencefragment cmp-experiencefragment--footer"><div id="container-49d3dcce9f" class="cmp-container" style=""><div class="aem-Grid aem-Grid--12 aem-Grid--default--12 "><div class="footer aem-GridColumn aem-GridColumn--default--12"><div class="cmp-footer"><div class="footer__main-footer"><div class="dsd-w-full"><h2 class="dsd-sr-only">Pied de page</h2> <img class="footer__logo" src="/content/dam/images/logos/commun/logo-desjardins-fr.svg" width="158" height="34" aria-label="Desjardins" alt=""><nav class="nav-footer nav-footer__columns" aria-label="Pied de page"><section class="nav-footer__section group-break"><h3 class="nav-footer__title ">Liens utiles</h3><ul class="nav-footer__list "><li><a href="/accompagnement-difficulte-financiere/index.jsp?navigMW=pp">Accompagnement en cas de difficulté financière </a></li><li><a href="/outils/index.jsp?navigMW=pp">Outils et calculateurs </a></li><li><a href="/fr/taux.html?navigMW=pp">Taux </a></li><li><a href="/localisateur/index.jsp?navigMW=pp">Points de service </a></li><li><a href="/securite/index.jsp?navigMW=pp">Sécurité </a></li><li><a href="/securite/suspendre-remplacer-carte/index.jsp?navigMW=pp">Carte perdue, volée ou défectueuse </a></li><li><a href="/fr/aide/profil-securite/changement-adresse-coordonnees.html?navigMW=pp">Changement d'adresse </a></li></ul></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title ">Aide et contact</h3><ul class="nav-footer__list "><li><a href="/fr/aide.html?navigMW=pp">Centre d'aide </a></li><li><a href="/FAQ/index.jsp?navigMW=pp">Foire aux questions </a></li><li><a href="/nous-joindre/index.jsp?navigMW=pp">Nous joindre </a></li></ul></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/particuliers/index.jsp?navigMW=pp"> Particuliers </a></h3><ul class="nav-footer__list d-none d-lg-block"><li><a href="/particuliers/comptes-services-relies/index.jsp?navigMW=pp">Comptes et services </a></li><li><a href="/fr/cartes-credit.html?navigMW=pp">Cartes de crédit </a></li><li><a href="/fr/hypotheque.html?navigMW=pp">Hypothèque </a></li><li><a href="/fr/prets-marges-credit.html?navigMW=pp">Prêts et marges de crédit </a></li><li><a href="/fr/epargne-placements.html?navigMW=pp">Épargne et placements </a></li><li><a href="/fr/assurances.html?navigMW=pp">Assurances<span class="dsd-sr-only"> Particuliers</span> </a></li><li><a href="/fr/gestion-patrimoine.html?navigMW=pp">Gestion de patrimoine </a></li><li><a href="/fr/offres.html?navigMW=pp">Offres </a></li><li><a href="/fr/epargne-placements/epargne-retraite-collective-participants.html?navigMW=pp">Épargne-retraite collective </a></li></ul></section><section class="nav-footer__section "><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/entreprises.html?navigMW=pp"> Entreprises </a></h3><ul class="nav-footer__list d-none d-lg-block"><li><a href="/fr/entreprises/comptes-tresorerie.html?navigMW=pp">Comptes et gestion de trésorerie </a></li><li><a href="/fr/entreprises/financement-prets.html?navigMW=pp">Financement et prêts </a></li><li><a href="/fr/entreprises/cartes-credit.html?navigMW=pp">Cartes de crédit </a></li><li><a href="/fr/entreprises/projets.html?navigMW=pp">Projets d'entreprise </a></li><li><a href="/fr/entreprises/offres.html?navigMW=pp">Offres par secteur </a></li><li><a href="/fr/entreprises/solutions-outils/partenaires.html?navigMW=pp">Partenaires d’affaires et solutions pour entreprises </a></li><li><a href="/fr/entreprises/solutions-outils.html?navigMW=pp">Solutions pour les employeurs </a></li><li><a href="/fr/entreprises/assurances.html?navigMW=pp">Assurances<span class="dsd-sr-only"> Entreprises</span> </a></li><li><a href="/fr/entreprises/international.html?navigMW=pp">Services internationaux </a></li><li><a href="/fr/entreprises/investissement-placements.html?navigMW=pp">Investissement et placements </a></li><li><a href="/fr/entreprises/marche-capitaux.html?navigMW=pp">Marché des capitaux </a></li><li><a href="https://www.fiduciedesjardins.com/fr/" target="_blank" class="consentRedirect">Services fiduciaires <span class="dsd-sr-only"> Lien externe. S'ouvre dans une nouvelle fenêtre.</span><svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" style="fill: #fff; height:.9em; margin-left:6px; width: .9em;"><path d="M12 3a1 1 0 110 2H2v17h17V12a1 1 0 012 0v11a1 1 0 01-1 1H1a1 1 0 01-1-1V4a1 1 0 011-1zm11-3a1 1 0 011 1v6a1 1 0 01-2 0V3.41L9.71 15.71a1 1 0 01-1.42 0 1 1 0 010-1.42L20.59 2H17a1 1 0 110-2z" fill-rule="evenodd" /></svg> </a></li><li><a href="/fr/entreprises/solutions-outils/epargne-retraite-collective.html?navigMW=pp">Épargne-retraite collective </a></li></ul></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/a-propos/index.jsp?navigMW=pp"> À propos </a></h3></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/carriere.html?navigMW=pp"> Carrière </a></h3><ul class="nav-footer__list d-none d-lg-block"><li><a href="/fr/carriere/travailler-chez-desjardins.html?navigMW=pp">Travailler chez Desjardins </a></li><li><a href="/fr/carriere/processus-recrutement.html?navigMW=pp">Processus de recrutement </a></li><li><a href="/fr/carriere/domaines-emplois.html?navigMW=pp">Domaines d’emplois </a></li></ul></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/conseils.html?navigMW=pp"> Conseils </a></h3></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/nouvelles.html?navigMW=pp"> Nouvelles </a></h3></section><section class="nav-footer__section group-break"><h3 class="nav-footer__title nav-footer__title--link"><a href="/fr/conseillers.html?navigMW=pp"> Espace conseillers et conseillères </a></h3></section><section class="nav-footer__section social-media"><h3 class="nav-footer__title">Suivez-nous<span class="dsd-sr-only"> sur les réseaux sociaux</span></h3><ul class="nav-footer__list nav-footer__list--inline"><li><a href="https://www.facebook.com/desjardins" class="social-media__link facebook" target="_blank" rel="noopener noreferrer"> <span class="dsd-sr-only">Facebook</span> <span class="dsd-sr-only"> – Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg aria-hidden="true" width="24" height="24" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22.7 0H1.3C.59.01.01.59 0 1.3v21.4c.01.71.59 1.29 1.3 1.3h11.5v-9.3H9.7v-3.6h3.1V8.4c0-3.1 1.9-4.8 4.7-4.8 1.3 0 2.5.1 2.8.1V7h-1.9c-1.5 0-1.8.7-1.8 1.8v2.3h3.6l-.5 3.6h-3.1V24h6.1a1.32 1.32 0 001.3-1.3V1.3A1.32 1.32 0 0022.7 0z" fill-rule="evenodd" /></svg> </a></li><li><a href="https://instagram.com/desjardinscoop" class="social-media__link instagram" target="_blank" rel="noopener noreferrer"> <span class="dsd-sr-only">Instagram</span> <span class="dsd-sr-only"> – Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M17 0c1 .05 1.97.25 2.9.6.8.3 1.52.78 2.1 1.4a4.6 4.6 0 011.3 2.2c.35.93.55 1.9.6 2.9l.04.55.02.3c.03.56.04 1.17.04 2.39V13.66c0 1.22-.01 1.83-.04 2.38l-.02.3-.04.56c-.05 1-.25 1.97-.6 2.9a7 7 0 01-1.4 2.1 4.87 4.87 0 01-2.1 1.4c-.93.34-1.9.55-2.9.6l-.55.04-.3.02c-.56.03-1.17.04-2.39.04H7c-1-.05-1.97-.25-2.9-.6-.8-.3-1.52-.78-2.1-1.4a4.6 4.6 0 01-1.3-2.2 9.76 9.76 0 01-.6-2.9l-.04-.55-.02-.3C.01 15.48 0 14.87 0 13.65v-3.32C0 9.12.01 8.5.04 7.96l.02-.31c0-.17.02-.35.04-.55a8.12 8.12 0 01.5-3A6.43 6.43 0 014.1.6a8.12 8.12 0 013-.5l.55-.04.3-.02C8.52.01 9.13 0 10.35 0H17zm-3.39 2.2H7.2c-.78.06-1.55.2-2.3.4-.54.18-1.02.49-1.4.9-.41.39-.72.87-.9 1.4-.2.75-.3 1.52-.3 2.3-.08.96-.1 1.4-.1 3.19v3.21c0 1.76.02 2.16.1 3.2a5 5 0 00.4 2.2c.18.53.49 1.01.9 1.4l.17.17c.35.33.77.58 1.23.73.7.26 1.45.4 2.2.4.96.08 1.4.1 3.19.1h3.22c1.75 0 2.15-.02 3.19-.1a5 5 0 002.2-.4 3.92 3.92 0 002.3-2.3c.26-.7.4-1.45.4-2.2l.04-.55.02-.2c.03-.58.04-1.18.04-2.44V12v-1.61c0-1.75-.02-2.15-.1-3.19a5 5 0 00-.4-2.2 3.39 3.39 0 00-.9-1.4l-.17-.17A3.38 3.38 0 0019 2.7c-.7-.26-1.45-.4-2.2-.4l-.55-.04-.2-.01c-.59-.04-1.18-.05-2.44-.05zM12 5.8a6.2 6.2 0 110 12.4 6.2 6.2 0 010-12.4zM12 8a4 4 0 100 8 4 4 0 000-8zm6.4-3.8a1.4 1.4 0 110 2.8 1.4 1.4 0 010-2.8z" /></svg> </a></li><li><a href="https://www.linkedin.com/company/desjardins" class="social-media__link linkedin" target="_blank" rel="noopener noreferrer"> <span class="dsd-sr-only" lang="en">LinkedIn</span> <span class="dsd-sr-only"> – Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M22.11 0H1.79A1.77 1.77 0 000 1.71v20.58a1.7 1.7 0 001.79 1.7h20.42c.96.02 1.76-.74 1.79-1.7V1.7A1.94 1.94 0 0022.11 0zm-15 20.59H3.59V8.99h3.58v11.6h-.06zM5.28 7.43a2.11 2.11 0 112.09-2.11 2.05 2.05 0 01-2.09 2.11zm15.13 13.16h-3.58v-5.6c0-1.3 0-3-1.79-3S13 13.37 13 14.87v5.73H9.36V8.99h3.39v1.6a3.74 3.74 0 013.38-1.9c3.59 0 4.28 2.42 4.28 5.53v6.37z" /></svg> </a></li><li><a href="https://www.youtube.com/mouvementdesjardins" class="social-media__link youtube" target="_blank" rel="noopener noreferrer"> <span class="dsd-sr-only" lang="en">YouTube</span> <span class="dsd-sr-only"> – Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre.</span><svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewbox="0 0 24 24"><path fill-rule="evenodd" clip-rule="evenodd" d="M23.47 6.66a2.87 2.87 0 00-2.11-2.16C19.45 4 12 4 12 4s-7.56 0-9.46.5A3.05 3.05 0 00.42 6.62C.13 8.56 0 10.53 0 12.5c-.01 1.95.17 3.9.53 5.82a2.87 2.87 0 002.11 2.16c1.8.53 9.31.53 9.31.53s7.5 0 9.4-.53a3.06 3.06 0 002.12-2.12c.37-1.94.54-3.9.53-5.87-.05-1.95-.22-3.9-.53-5.83zM9.52 16.09v-7.2l6.23 3.6-6.23 3.6z" /></svg> </a></li></ul></section><section class="nav-footer__section mobile d-block d-md-none"><h3 class="nav-footer__title">Application mobile</h3><ul class="nav-footer__list nav-footer__list--inline"><li><a href="https://itunes.apple.com/ca/app/services-mobiles-desjardins/id386636953?l=fr&ls=1&mt=8" target="_blank" rel="noopener noreferrer"> <img src="/content/dam/images/logos/commun/logo-app-store-fr.svg" alt="Télécharger dans l'App Store. Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre." width="159" height="48"> </a></li><li><a href="https://play.google.com/store/apps/details?id=com.desjardins.mobile&hl=fr" target="_blank" rel="noopener noreferrer"> <img src="/content/dam/images/logos/commun/logo-app-google-fr.svg" alt="Disponible sur Google Play. Lien externe au site. Cet hyperlien s'ouvrira dans une nouvelle fenêtre." width="159" height="48"> </a></li></ul></section></nav><script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Desjardins","sameAs":["https://www.facebook.com/desjardins","https://instagram.com/desjardinscoop","https://www.linkedin.com/company/desjardins","https://www.youtube.com/mouvementdesjardins"]}</script></div></div><div class="footer__legal-footer"><div class="dsd-w-full"><div class="footer-legal"><div><nav class="secondary-nav-footer" aria-label="Zone légale"><ul class="secondary-nav-footer__list"><li><a href="/conditions-utilisation-notes-legales/index.jsp?navigMW=pp"> Conditions d'utilisation et notes légales </a></li><li><a href="/confidentialite/index.jsp?navigMW=pp"> Confidentialité </a></li><li><a href="#" class="ot-sdk-show-settings" role="button"> Personnaliser les témoins </a></li><li><a href="/fr/a-propos/communaute/accessibilite.html?navigMW=pp"> Accessibilité </a></li><li><a href="/plan-site/index.jsp?navigMW=pp"> Plan du site </a></li></ul></nav><p class="dsd-c-light-white small footer__copyright-text">© 1996-<span data-current-year></span>, Fédération des caisses Desjardins du Québec. Tous droits réservés.</p></div></div></div></div></div></div></div></div></div></footer></div></div><script src="/etc.clientlibs/dcom/clientlibs/clientlib-site.min.8a141e9b6ced4c3c99cc23c2687da7bc.js"></script><script src="/etc.clientlibs/core/wcm/components/commons/site/clientlibs/container.min.f103c0d3728926b3e68183cb0f66a564.js"></script><script src="/etc.clientlibs/dcom/clientlibs/clientlib-base.min.c563a4d0d4bb5918db7ab92bf3d07972.js"></script><script type="module" src="https://static.desjardins.com/applications/particulier/oel-clavardage-toolkit/oel-clavardage-toolkit.js"></script></body></html> | |
| \ No newline at end of file | ||
added
tests/fixtures/mortgage/eq-bank.html
+1 −0
@@ -0,0 +1 @@ | ||
| 1 | +-symbol-en.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/3WE11Dm5S14ER67sTCsg5Z/10056c09a08796fcfd2565cc04c9f498/eq.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/v6dN0g1G8KgCrjZFaZHKf/75373fc60bf66e0cd9fd9a080f01bfb7/doc.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/4E9Qdzk4lUddTQece0WFh4/0a9d73a8bd204c795157075f193b837b/icon-universal-mortgage-default.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/5rRyfMd7kYee0o3QagefON/12644c3907c133328d1a3e016e1d11a9/icon-universal-phone-call-default.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/3Wv1EPcGa9I7qH4MelevI7/49ae86ee467e0038a6de7b52f6a41bd9/other-banks.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/5noxYcYlq8t9jttekJFGWB/87c3696343f6adce40566370b05a73d0/rsp.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/6pTxMkuJAvBBF9J0hmGWr4/3d2951e76864cc7c0914b4778b00ecdf/Badge_AppStore.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/1QDBdyk85oM64SmK9vgg2e/b648970a36f489f4213c3800e8fd5aa0/Badge_GooglePlay.svg\",\"image\"]\n1e:I[58395,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"TemplatingText\"]\n18:[[[\"$\",\"$1\",\"popupModal\",{\"children\":null}],[\"$\",\"$1\",\"notificationBanner\",{\"children\":null}],[\"$\",\"$1\",\"promoFloatingBanner\",{\"children\":null}]],[\"$\",\"main\",null,{\"id\":\"main-content\",\"tabIndex\":-1,\"children\":[null,[[\"$\",\"section\",\"section-0\",{\"className\":\"_2abK9jo6\",\"imageIsAnimated\":false,\"children\":[[\"$\",\"div\",null,{\"className\":\"exn5rbSy\",\"children\":[[\"$\",\"p\",null,{\"className\":\"_4HZoZws0 dl7e6E5Q dMbHxgb- IwNtFlOW\",\"children\":\"Mortgage rates\"}],[\"$\",\"$L1e\",null,{\"text\":\"Rates\",\"align\":\"center\",\"variant\":\"h1-max\",\"className\":\"_4eiuwmkF\",\"global\":{\"locale\":\"en-CA\",\"rates\":{\"APR-5-Year-Fixed\":{\"name\":\"APR-5-Year-Fixed\",\"rate\":5.673},\"APR-1-Year-Fixed\":{\"name\":\"APR-1-Year-Fixed\",\"rate\":6.544,\"decimalPlaces\":\"3\"},\"Standard-Mortgage-Rate-5-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-5-Year-Fixed\",\"rate\":5.14},\"Standard-Mortgage-Rate-1-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-1-Year-Fixed\",\"rate\":5.04},\"GIC-1-Year\":{\"name\":\"GIC 1 Year\",\"rate\":3.4},\"GIC-3-Month\":{\"name\":\"GIC 3 Month\",\"rate\":2.4},\"GIC-15-Month\":{\"name\":\"GIC 15 Month\",\"rate\":3.45},\"GIC-3-Year-Registered\":{\"name\":\"GIC 3 Year\",\"rate\":3.8},\"GIC-4-Year\":{\"name\":\"GIC 4 Year\",\"rate\":3.9},\"GIC-3-Month-Registered\":{\"name\":\"GIC 3 Month\",\"rate\":2.4},\"GIC-4-Year-Registered\":{\"name\":\"GIC 4 Year\",\"rate\":3.9},\"GIC-9-Month\":{\"name\":\"GIC 9 Month\",\"rate\":3.1},\"GIC-1-Year-Registered\":{\"name\":\"GIC 1 Year\",\"rate\":3.4},\"GIC-15-Month-Registered\":{\"name\":\"GIC 15 Month\",\"rate\":3.45},\"GIC-3-Year\":{\"name\":\"GIC 3 Year\",\"rate\":3.8},\"GIC-2-Year-Registered\":{\"name\":\"GIC 2 Year\",\"rate\":3.65},\"GIC-2-Year\":{\"name\":\"GIC 2 Year\",\"rate\":3.65},\"GIC-9-Month-Registered\":{\"name\":\"GIC 9 Month\",\"rate\":3.1},\"Annual-Percentage-Rate-(APR)-5-Year-Adjustable\":{\"name\":\"Annual-Percentage-Rate-(APR)-5-Year-Adjustable\",\"rate\":3.551,\"decimalPlaces\":\"3\"},\"Annual-Percentage-Rate-(APR)-5-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-5-Year-Fixed\",\"rate\":4.546},\"EQB-Evolution-Suite-5-Year-Adjustable\":{\"name\":\"EQB-Evolution-Suite-5-Year-Adjustable\",\"rate\":0.95},\"es-fixed-60-month\":{\"name\":\"esFixed60Month\",\"rate\":4.54},\"USD-SBB-Account\":{\"name\":\"Business US Dollar Account \",\"rate\":2.5},\"Annual-Percentage-Rate-(APR)-3-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-3-Year-Fixed\",\"rate\":4.379},\"es-fixed-36-month\":{\"name\":\"esFixed36Month\",\"rate\":4.34},\"Annual-Percentage-Rate-(APR)-1-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-1-Year-Fixed\",\"rate\":6.41,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-5-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-5-Year-Fixed-APR\",\"rate\":6.28,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-2-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-2-Year-Fixed-APR\",\"rate\":6.69,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-6-Month-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-6-Month-Fixed-APR \",\"rate\":6.98,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-5-Year-Adjustable-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-5-Year-Adjustable-APR\",\"rate\":6.79,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-3-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-3-Year-Fixed-APR\",\"rate\":6.58,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-Rates-Reset-1-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Reset-1-Year-Fixed-APR\",\"rate\":6.89,\"decimalPlaces\":\"3\"},\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable-APR\",\"rate\":7.775},\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable\",\"rate\":3.18},\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed-APR\",\"rate\":7.465},\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed\",\"rate\":7.43},\"Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed-APR\",\"rate\":7.984},\"Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed\",\"rate\":7.83},\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable-APR\",\"rate\":6.943},\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed-APR\",\"rate\":6.357},\"Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed-APR\",\"rate\":6.782},\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable\",\"rate\":2.34},\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed\",\"rate\":6.28},\"Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed\",\"rate\":6.58},\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable-APR\",\"rate\":6.903},\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed-APR\",\"rate\":6.309},\"Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed-APR\",\"rate\":6.753},\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable\",\"rate\":2.3},\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed\",\"rate\":6.23},\"Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed\",\"rate\":6.55},\"gic-1-year-non-registered\":{\"name\":\"GIC 1 Year\",\"rate\":3.3},\"equitable-prime-rate\":{\"name\":\"Equitable-Prime-Rate\",\"rate\":4.45},\"es-fixed-48-month\":{\"name\":\"esFixed48Month\",\"rate\":4.64},\"es-fixed-24-month\":{\"name\":\"esFixed24Month\",\"rate\":5.39},\"es-fixed-12-month\":{\"name\":\"esFixed12Month\",\"rate\":6.29},\"corporate-series-f-usd\":{\"name\":\"corporate-series-f-usd\",\"rate\":3},\"corporate-series-a-usd\":{\"name\":\"corporate-series-a-usd\",\"rate\":2.9},\"personal-series-f-usd\":{\"name\":\"personal-series-f-usd\",\"rate\":3.05},\"personal-series-a-usd\":{\"name\":\"personal-series-a-usd\",\"rate\":2.9},\"corporate-series-f\":{\"name\":\"corporate-series-f\",\"rate\":1.9},\"corporate-series-a\":{\"name\":\"corporate-series-a\",\"rate\":1.8},\"personal-series-f\":{\"name\":\"personal-series-f\",\"rate\":2.05},\"personal-series-a\":{\"name\":\"personal-series-a\",\"rate\":1.9},\"hisa-usd-eqb\":{\"name\":\"hisa-usd-eqb\",\"rate\":2.9},\"hisa-cad-eqb\":{\"name\":\"hisa-cad-eqb\",\"rate\":1.9},\"mortgage-rate-variable-5-year-apr\":{\"name\":\"Variable APR Mortgage Rate\",\"rate\":4.05},\"mortgage-rate-variable-5-year\":{\"name\":\"Variable Mortgage Rate\",\"rate\":4},\"mortgage-rate-fixed-5-year-apr\":{\"name\":\"Fixed APR Mortgage Rate\",\"rate\":4.06},\"mortgage-rate-fixed-5-year\":{\"name\":\"Fixed Mortgage Rate\",\"rate\":4.04},\"RRSP-Cash-Savings-Account\":{\"name\":\"RRSP Cash Savings Account\",\"rate\":1.5},\"US-Dollar-Account\":{\"name\":\"US Dollar Account\",\"rate\":2.5},\"SBB-cash-back\":{\"name\":\"SBB-cash-back\",\"rate\":1},\"APR-2-Year-Fixed\":{\"name\":\"APR-2-Year-Fixed\",\"rate\":5.951},\"Standard-Mortgage-Rate-2-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-2-Year-Fixed\",\"rate\":5.14},\"EQB-Evolution-Suite-6-Month-Fixed\":{\"name\":\"EQB-Evolution-Suite-6-month-Fixed\",\"rate\":7.54},\"Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed-APR\",\"rate\":6.792},\"Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed-APR\",\"rate\":7.512},\"Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed-APR\",\"rate\":8.569},\"Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed\",\"rate\":6.49},\"Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed\",\"rate\":6.79},\"Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed\",\"rate\":6.88},\"Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed-APR\",\"rate\":8.186},\"Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed-APR\",\"rate\":8.808},\"Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed-APR\",\"rate\":9.634},\"Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed\",\"rate\":7.94},\"Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed\",\"rate\":8.14},\"Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed\",\"rate\":7.98},\"Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed-APR\",\"rate\":6.985},\"Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed-APR\",\"rate\":7.608},\"Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed\",\"rate\":6.69},\"Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed\",\"rate\":6.89},\"Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed-APR\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed-APR\",\"rate\":8.666},\"Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed\":{\"name\":\"Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed\",\"rate\":6.98},\"Annual-Percentage-Rate-(APR)-4-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-4-Year-Fixed\",\"rate\":4.648},\"Annual-Percentage-Rate-(APR)-2-Year-Fixed\":{\"name\":\"Annual-Percentage-Rate-(APR)-2-Year-Fixed\",\"rate\":5.432},\"APR-5-Year-Adjustable\":{\"name\":\"APR-5-Year-Adjustable\",\"rate\":4.999},\"APR-4-Year-Fixed\":{\"name\":\"APR-4-Year-Fixed\",\"rate\":6.416},\"APR-3-Year-Fixed\":{\"name\":\"APR-3-Year-Fixed\",\"rate\":5.847},\"Standard-Mortgage-Rate-5-Year-Adjustable\":{\"name\":\"Standard-Mortgage-Rate-5-Year-Adjustable\",\"rate\":0.04},\"Standard-Mortgage-Rate-4-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-4-Year-Fixed\",\"rate\":6.19},\"Standard-Mortgage-Rate-3-Year-Fixed\":{\"name\":\"Standard-Mortgage-Rate-3-Year-Fixed\",\"rate\":5.24},\"GIC-10-Year-Registered\":{\"name\":\"GIC 10 Year\",\"rate\":2.35},\"GIC-7-Year-Registered\":{\"name\":\"GIC 7 Year\",\"rate\":2.35},\"GIC-5-Year-Registered\":{\"name\":\"GIC 5 Year\",\"rate\":4},\"GIC-27-Month-Registered\":{\"name\":\"GIC 27 Month\",\"rate\":3.7},\"GIC-6-Month-Registered\":{\"name\":\"GIC 6 Month\",\"rate\":2.75},\"Business-account\":{\"name\":\"sbb\",\"rate\":2.25},\"Joint-Account-Base-Rate\":{\"name\":\"Joint Account Base Rate \",\"rate\":1},\"GIC-6-Year-Registered\":{\"name\":\"GIC 6 Year\",\"rate\":2.35},\"Personal-Account-Base-Rate\":{\"name\":\"Personal Account Base Rate \",\"rate\":1},\"30 Day-Notice-Savings-Account\":{\"name\":\"30 Day Notice Savings Account\",\"rate\":2.75},\"GIC-6-Month\":{\"name\":\"GIC 6 Month\",\"rate\":2.75},\"GIC-27-Month\":{\"name\":\"GIC 27 Month\",\"rate\":3.7},\"GIC-7-Year\":{\"name\":\"GIC 7 Year\",\"rate\":2.35},\"GIC-5-Year\":{\"name\":\"GIC 5 Year\",\"rate\":4},\"GIC-6-Year\":{\"name\":\"GIC 6 Year\",\"rate\":2.35},\"GIC-10-Year\":{\"name\":\"GIC 10 Year\",\"rate\":2.35},\"10 Day-Notice-Savings-Account\":{\"name\":\"10 Day Notice Savings Account\",\"rate\":2.35},\"Joint-Account-Payroll-Account\":{\"name\":\"Joint Account Payroll Account\",\"rate\":2.75},\"Personal-Account-Payroll-Rate\":{\"name\":\"Personal Account Payroll Rate\",\"rate\":2.75},\"Personal-Account-bonus-interest-rate\":{\"name\":\"Personal Account bonus interest rate\",\"rate\":1.75},\"Joint-Account-bonus-interest-rate\":{\"name\":\"Joint Account bonus interest rate\",\"rate\":1.75},\"TFSA-Cash-Savings-Account\":{\"name\":\"TFSA Cash Savings Account\",\"rate\":1.5},\"FHSA-cash-savings-account\":{\"name\":\"FHSA Cash Savings Account\",\"rate\":1.5},\"cannex-annual-1-yr\":{\"name\":\"cannex-annual-1-yr\",\"rate\":3.01},\"cannex-annual-2-yr\":{\"name\":\"cannex-annual-2-yr\",\"rate\":3.69},\"cannex-annual-3-yr\":{\"name\":\"cannex-annual-3-yr\",\"rate\":3.96},\"cannex-annual-4-yr\":{\"name\":\"cannex-annual-4-yr\",\"rate\":4.04},\"cannex-annual-5-yr\":{\"name\":\"cannex-annual-5-yr\",\"rate\":4.16},\"cannex-annual-6-yr\":{\"name\":\"cannex-annual-6-yr\",\"rate\":2.25},\"cannex-annual-7-yr\":{\"name\":\"cannex-annual-7-yr\",\"rate\":2.25},\"cannex-annual-8-yr\":{\"name\":\"cannex-annual-8-yr\",\"rate\":2.25},\"cannex-annual-9-yr\":{\"name\":\"cannex-annual-9-yr\",\"rate\":2.25},\"cannex-annual-10-yr\":{\"name\":\"cannex-annual-10-yr\",\"rate\":2.25},\"cannex-semi-annual-1-yr\":{\"name\":\"cannex-semi-annual-1-yr\",\"rate\":2.97},\"cannex-semi-annual-2-yr\":{\"name\":\"cannex-semi-annual-2-yr\",\"rate\":3.65},\"cannex-semi-annual-3-yr\":{\"name\":\"cannex-semi-annual-3-yr\",\"rate\":3.92},\"cannex-semi-annual-4-yr\":{\"name\":\"cannex-semi-annual-4-yr\",\"rate\":4},\"cannex-semi-annual-5-yr\":{\"name\":\"cannex-semi-annual-5-yr\",\"rate\":4.12},\"cannex-semi-annual-6-yr\":{\"name\":\"cannex-semi-annual-6-yr\",\"rate\":2.21},\"cannex-semi-annual-7-yr\":{\"name\":\"cannex-semi-annual-7-yr\",\"rate\":2.21},\"cannex-semi-annual-8-yr\":{\"name\":\"cannex-semi-annual-8-yr\",\"rate\":2.21},\"cannex-semi-annual-9-yr\":{\"name\":\"cannex-semi-annual-9-yr\",\"rate\":2.21},\"cannex-semi-annual-10-yr\":{\"name\":\"cannex-semi-annual-10-yr\",\"rate\":2.21},\"cannex-quarterly-1-yr\":{\"name\":\"cannex-quarterly-1-yr\",\"rate\":2.94},\"cannex-quarterly-2-yr\":{\"name\":\"cannex-quarterly-2-yr\",\"rate\":3.62},\"cannex-quarterly-3-yr\":{\"name\":\"cannex-quarterly-3-yr\",\"rate\":3.89},\"cannex-quarterly-4-yr\":{\"name\":\"cannex-quarterly-4-yr\",\"rate\":3.97},\"cannex-quarterly-5-yr\":{\"name\":\"cannex-quarterly-5-yr\",\"rate\":4.09},\"cannex-quarterly-6-yr\":{\"name\":\"cannex-quarterly-6-yr\",\"rate\":2.18},\"cannex-quarterly-7-yr\":{\"name\":\"cannex-quarterly-7-yr\",\"rate\":2.18},\"cannex-quarterly-8-yr\":{\"name\":\"cannex-quarterly-8-yr\",\"rate\":2.18},\"cannex-quarterly-9-yr\":{\"name\":\"cannex-quarterly-9-yr\",\"rate\":2.18},\"cannex-quarterly-10-yr\":{\"name\":\"cannex-quarterly-10-yr\",\"rate\":2.18},\"cannex-monthly-1-yr\":{\"name\":\"cannex-monthly-1-yr\",\"rate\":2.92},\"cannex-monthly-2-yr\":{\"name\":\"cannex-monthly-2-yr\",\"rate\":3.6},\"cannex-monthly-3-yr\":{\"name\":\"cannex-monthly-3-yr\",\"rate\":3.87},\"cannex-monthly-4-yr\":{\"name\":\"cannex-monthly-4-yr\",\"rate\":3.95},\"cannex-monthly-5-yr\":{\"name\":\"cannex-monthly-5-yr\",\"rate\":4.07},\"cannex-monthly-6-yr\":{\"name\":\"cannex-monthly-6-yr\",\"rate\":2.16},\"cannex-monthly-7-yr\":{\"name\":\"cannex-monthly-7-yr\",\"rate\":2.16},\"cannex-monthly-8-yr\":{\"name\":\"cannex-monthly-8-yr\",\"rate\":2.16},\"cannex-monthly-9-yr\":{\"name\":\"cannex-monthly-9-yr\",\"rate\":2.16},\"cannex-monthly-10-yr\":{\"name\":\"cannex-monthly-10-yr\",\"rate\":2.16},\"cannex-cacheable\":{\"name\":\"cannex-cacheable\",\"rate\":1.5},\"cannex-ustd-annual-1-yr\":{\"name\":\"cannex-ustd-annual-1-yr\",\"rate\":4.1},\"cannex-ustd-annual-2-yr\":{\"name\":\"cannex-ustd-annual-2-yr\",\"rate\":3.95},\"cannex-ustd-annual-3-yr\":{\"name\":\"cannex-ustd-annual-3-yr\",\"rate\":3.95},\"cannex-ustd-annual-4-yr\":{\"name\":\"cannex-ustd-annual-4-yr\",\"rate\":4},\"cannex-ustd-annual-5-yr\":{\"name\":\"cannex-ustd-annual-5-yr\",\"rate\":4.05},\"cannex-ustd-annual-6-yr\":{\"name\":\"cannex-ustd-annual-6-yr\",\"rate\":2.5},\"cannex-ustd-annual-7-yr\":{\"name\":\"cannex-ustd-annual-7-yr\",\"rate\":2.5},\"cannex-ustd-annual-8-yr\":{\"name\":\"cannex-ustd-annual-8-yr\",\"rate\":2.5},\"cannex-ustd-annual-9-yr\":{\"name\":\"cannex-ustd-annual-9-yr\",\"rate\":2.5},\"cannex-ustd-annual-10-yr\":{\"name\":\"cannex-ustd-annual-10-yr\",\"rate\":2.5},\"cannex-ustd-semi-annual-1-yr\":{\"name\":\"cannex-ustd-semi-annual-1-yr\",\"rate\":4.06},\"cannex-ustd-semi-annual-2-yr\":{\"name\":\"cannex-ustd-semi-annual-2-yr\",\"rate\":3.91},\"cannex-ustd-semi-annual-3-yr\":{\"name\":\"cannex-ustd-semi-annual-3-yr\",\"rate\":3.91},\"cannex-ustd-semi-annual-4-yr\":{\"name\":\"cannex-ustd-semi-annual-4-yr\",\"rate\":3.96},\"cannex-ustd-semi-annual-5-yr\":{\"name\":\"cannex-ustd-semi-annual-5-yr\",\"rate\":4.01},\"cannex-ustd-semi-annual-6-yr\":{\"name\":\"cannex-ustd-semi-annual-6-yr\",\"rate\":2.46},\"cannex-ustd-semi-annual-7-yr\":{\"name\":\"cannex-ustd-semi-annual-7-yr\",\"rate\":2.46},\"cannex-ustd-semi-annual-8-yr\":{\"name\":\"cannex-ustd-semi-annual-8-yr\",\"rate\":2.46},\"cannex-ustd-semi-annual-9-yr\":{\"name\":\"cannex-ustd-semi-annual-9-yr\",\"rate\":2.46},\"cannex-ustd-semi-annual-10-yr\":{\"name\":\"cannex-ustd-semi-annual-10-yr\",\"rate\":2.46},\"cannex-ustd-quarterly-1-yr\":{\"name\":\"cannex-ustd-quarterly-1-yr\",\"rate\":4.03},\"cannex-ustd-quarterly-2-yr\":{\"name\":\"cannex-ustd-quarterly-2-yr\",\"rate\":3.88},\"cannex-ustd-quarterly-3-yr\":{\"name\":\"cannex-ustd-quarterly-3-yr\",\"rate\":3.88},\"cannex-ustd-quarterly-4-yr\":{\"name\":\"cannex-ustd-quarterly-4-yr\",\"rate\":3.93},\"cannex-ustd-quarterly-5-yr\":{\"name\":\"cannex-ustd-quarterly-5-yr\",\"rate\":3.98},\"cannex-ustd-quarterly-6-yr\":{\"name\":\"cannex-ustd-quarterly-6-yr\",\"rate\":2.43},\"cannex-ustd-quarterly-7-yr\":{\"name\":\"cannex-ustd-quarterly-7-yr\",\"rate\":2.43},\"cannex-ustd-quarterly-8-yr\":{\"name\":\"cannex-ustd-quarterly-8-yr\",\"rate\":2.43},\"cannex-ustd-quarterly-9-yr\":{\"name\":\"cannex-ustd-quarterly-9-yr\",\"rate\":2.43},\"cannex-ustd-quarterly-10-yr\":{\"name\":\"cannex-ustd-quarterly-10-yr\",\"rate\":2.43},\"cannex-ustd-monthly-1-yr\":{\"name\":\"cannex-ustd-monthly-1-yr\",\"rate\":4.01},\"cannex-ustd-monthly-2-yr\":{\"name\":\"cannex-ustd-monthly-2-yr\",\"rate\":3.86},\"cannex-ustd-monthly-3-yr\":{\"name\":\"cannex-ustd-monthly-3-yr\",\"rate\":3.86},\"cannex-ustd-monthly-4-yr\":{\"name\":\"cannex-ustd-monthly-4-yr\",\"rate\":3.91},\"cannex-ustd-monthly-5-yr\":{\"name\":\"cannex-ustd-monthly-5-yr\",\"rate\":3.96},\"cannex-ustd-monthly-6-yr\":{\"name\":\"cannex-ustd-monthly-6-yr\",\"rate\":2.41},\"cannex-ustd-monthly-7-yr\":{\"name\":\"cannex-ustd-monthly-7-yr\",\"rate\":2.41},\"cannex-ustd-monthly-8-yr\":{\"name\":\"cannex-ustd-monthly-8-yr\",\"rate\":2.41},\"cannex-ustd-monthly-9-yr\":{\"name\":\"cannex-ustd-monthly-9-yr\",\"rate\":2.41},\"cannex-ustd-monthly-10-yr\":{\"name\":\"cannex-ustd-monthly-10-yr\",\"rate\":2.41},\"cannex-ustd-cacheable\":{\"name\":\"cannex-ustd-cacheable\",\"rate\":1.75},\"cannex-short-term-30-days\":{\"name\":\"cannex-short-term-30-days\",\"rate\":0.2},\"cannex-short-term-60-days\":{\"name\":\"cannex-short-term-60-days\",\"rate\":0.8},\"cannex-short-term-90-days\":{\"name\":\"cannex-short-term-90-days\",\"rate\":2.15},\"cannex-short-term-120-days\":{\"name\":\"cannex-short-term-120-days\",\"rate\":2.2},\"cannex-short-term-180-days\":{\"name\":\"cannex-short-term-180-days\",\"rate\":2.7},\"cannex-short-term-270-days\":{\"name\":\"cannex-short-term-270-days\",\"rate\":2.8},\"cannex-ustd-short-term-30-days\":{\"name\":\"cannex-ustd-short-term-30-days\",\"rate\":0.05},\"cannex-ustd-short-term-60-days\":{\"name\":\"cannex-ustd-short-term-60-days\",\"rate\":1},\"cannex-ustd-short-term-90-days\":{\"name\":\"cannex-ustd-short-term-90-days\",\"rate\":2.95},\"cannex-ustd-short-term-120-days\":{\"name\":\"cannex-ustd-short-term-120-days\",\"rate\":3},\"cannex-ustd-short-term-180-days\":{\"name\":\"cannex-ustd-short-term-180-days\",\"rate\":3.15},\"cannex-ustd-short-term-270-days\":{\"name\":\"cannex-ustd-short-term-270-days\",\"rate\":3.3}},\"dynamicTexts\":{\"cannex-annual-deposit\":\"$$1000\",\"cannex-semi-annual-deposit\":\"$$1000\",\"cannex-quarterly-deposit\":\"$$1000\",\"cannex-monthly-deposit\":\"$$1000\",\"cannex-cacheable-deposit\":\"$$1000\",\"cannex-ustd-annual-deposit\":\"$$1000\",\"cannex-ustd-semi-annual-deposit\":\"$$1000\",\"cannex-ustd-quarterly-deposit\":\"$$1000\",\"cannex-ustd-monthly-deposit\":\"$$1000\",\"cannex-ustd-cacheable-deposit\":\"$$1000\",\"cannex-short-term-deposit\":\"$$1000\",\"cannex-ustd-short-term-deposit\":\"$$1000\"},\"dates\":{\"cannex-update-time\":\"2026-08-24T11:30:21.000+00:00\"},\"site\":{\"id\":\"eqbank\",\"name\":\"EQ Bank\",\"canonicalDomain\":\"eqbank.ca\",\"domains\":[\"eqbank.ca\",\"www.eqbank.ca\",\"dev.eqbank.ca\",\"qa.eqbank.ca\",\"stage.eqbank.ca\",\"preprod.eqbank.ca\",\"live-preview.eqbank.ca\",\"eqbank.localhost\"],\"environments\":{\"local\":\"http://eqbank.localhost:3000\",\"dev\":\"https://dev.eqbank.ca\",\"qa\":\"https://qa.eqbank.ca\",\"stage\":\"https://stage.eqbank.ca\",\"preprod\":\"https://preprod.eqbank.ca\",\"live-preview\":\"https://live-preview.eqbank.ca\",\"prod\":\"https://eqbank.ca\"},\"deploymentHostPatterns\":[\"^cms-marketing-frontend-.+-eqbank\\\\.vercel\\\\.app$\"],\"defaultLocale\":\"en-CA\",\"locales\":[\"en-CA\",\"fr-CA\"],\"homeSlug\":\"eqbank-home\",\"faviconPath\":\"/eqbank/eqbank-favicon.png\"},\"preview\":false,\"trustpilotConfig\":{\"templateId\":\"5419b732fbfb950b10de65e5\",\"businessUnitId\":\"61ba3de3d136c62d8cb4ffda\",\"publicToken\":\"0ad29663-8633-493a-b481-ce084db74a1d\"},\"breadcrumbs\":[{\"label\":\"Residential\",\"url\":\"/residential\"},{\"label\":\"Mortgage Rates | EQ Bank\"}],\"recaptchaSiteKey\":\"6LfRduosAAAAAC6UODtoNvU5myTiVIB0cYm765bL\"}}],false,false,\"$undefined\",\"$undefined\",\"$undefined\"]}],\"$undefined\",false]}],\"$L1f\",\"$L20\",\"$L21\",\"$L22\"]]}],[\"$L23\"],[\"$L24\"],[\"$L25\"],\"$L26\",false]\n27:I[53595,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"SuperscriptAnchor\"]\n2c:I[11675,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"Accordion\"]\n2d:I[17922,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"Tab\"]\n42:I[79520,[\"/_next/static/chunks/307yuz09zvnjr.js\",\"/_next/static/chunks/3qxwgz3imjo3p.js\",\"/_next/static/chunks/2hrnrrw_5etbq.js\",\"/_next/static/chunks/1sht1k1qgvije.js\"],\"\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/7vfM8PDSeI0d5KVOI9R7v/e74f30e1781a2419fab4435dbf728f1a/cdic-digital-symbol-en.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/3WE11Dm5S14ER67sTCsg5Z/10056c09a08796fcfd2565cc04c9f498/eq.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/v6dN0g1G8KgCrjZFaZHKf/75373fc60bf66e0cd9fd9a080f01bfb7/doc.svg\",\"image\"]\n:HL[\"https://images.ctfassets.net/ymwa45h4u77x/4E9Qdzk4lUddTQece0WFh4/0a9d73a8bd204c795157075f193b837b/icon-universal-mortgage-default.svg\",\"image\"]\n1f:[\"$\",\"section\",\"section-1\",{\"className\":\"d63g793G\",\"children\":[\"$\",\"div\",null,{\"className\":\"_3l8o1BG-\",\"children\":[[\"$\",\"div\",null,{\"className\":\"zQF3-HGX osMNYblD\",\"children\":[[\"$\",\"$L1e\",null,{\"variant\":\"h2\",\"align\":\"left\",\"text\":\"Mortgages\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}],\"$undefined\"]}],\"$undefined\",false,[\"$\",\"div\",null,{\"className\":\"aA-mr9Tm\",\"children\":[[\"$\",\"$1\",\"Mortgage Table-0\",{\"children\":[[\"$\",\"div\",\"section-0\",{\"className\":\"_8obCEoY-\",\"children\":[false,[\"$\",\"div\",null,{\"className\":\"\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"div\",\"0\",{\"className\":\"TIsw3vQr\",\"children\":[\"$\",\"div\",null,{\"className\":\"b35B6Buq\",\"children\":[\"$\",\"table\",null,{\"className\":\"kYHYNgYX UxR5MIf-\",\"children\":[[[\"$\",\"thead\",\".$0\",{\"className\":\"sOBWLSWW _8j9TiMPl\",\"children\":[\"$\",\"tr\",null,{\"children\":[[\"$\",\"th\",\"0\",{\"id\":\"_S_1_-col-0\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"Mortgage\"}]]}]]}]]}]}],[\"$\",\"th\",\"1\",{\"id\":\"_S_1_-col-1\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"6 Month\"}],[\"$\",\"$L27\",\"templating-text-node-1\",{\"label\":\"2\",\"href\":\"#two\"}],[\"$\",\"$1\",\"templating-text-node-2\",{\"children\":\" \"}]]}]]}]]}]}],[\"$\",\"th\",\"2\",{\"id\":\"_S_1_-col-2\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"1 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"3\",{\"id\":\"_S_1_-col-3\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"2 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"4\",{\"id\":\"_S_1_-col-4\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"3 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"5\",{\"id\":\"_S_1_-col-5\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"4 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"6\",{\"id\":\"_S_1_-col-6\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"5 Year Fixed\"}]]}]]}]]}]}],[\"$\",\"th\",\"7\",{\"id\":\"_S_1_-col-7\",\"className\":\"Fg60Z0jq\",\"scope\":\"col\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"span\",\"0\",{\"className\":\"_4HZoZws0 vMKEO-FH\",\"children\":[[\"$\",\"strong\",\"0\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"5 Year Adjustable\"}]]}]]}]]}]}]]}]}]],[\"$\",\"tbody\",null,{\"children\":[[\"$\",\"tr\",\".$1\",{\"children\":[[\"$\",\"td\",\"0\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-0\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003cbold\u003eStandard Mortgage Rate (Closed) \u003c/bold\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"1\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-1\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"--\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"2\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-2\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-1-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"3\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-3\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-2-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"4\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-4\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-3-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"5\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-5\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-4-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"6\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-6\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eStandard-Mortgage-Rate-5-Year-Fixed\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"7\",{\"className\":\"oWWJNKFk\",\"headers\":\"_S_1_-col-7\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"P + \u003crate\u003eStandard-Mortgage-Rate-5-Year-Adjustable\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}]]}],\"$L28\",\"$L29\",\"$L2a\"]}]]}]}]}]]}]}]]}]]}],\"$L2b\"]}],\"$undefined\",\"$undefined\"]}]}]\n20:[\"$\",\"div\",\"section-2\",{\"className\":\"_8obCEoY-\",\"children\":[\"$undefined\",[\"$\",\"div\",null,{\"className\":\"\",\"children\":[\"$\",\"div\",null,{\"className\":\"JW50HDsB zj8Dw3Eq\",\"children\":[[\"$\",\"div\",\"0\",{\"className\":\"TIsw3vQr\",\"children\":[\"$\",\"div\",null,{\"className\":\"\",\"children\":[\"$\",\"table\",null,{\"className\":\"kYHYNgYX qFKpzMCz\",\"children\":[[],[\"$\",\"tbody\",null,{\"children\":[[\"$\",\"tr\",\".$0\",{\"children\":[[\"$\",\"td\",\"0\",{\"className\":\"oWWJNKFk\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003cbold\u003eEquitable Prime Rate (P)\u003c/bold\u003e \",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}],[\"$\",\"td\",\"1\",{\"className\":\"oWWJNKFk\",\"children\":[\"$\",\"$L1e\",null,{\"variant\":\"body\",\"text\":\"\u003crate\u003eequitable-prime-rate\u003c/rate\u003e\",\"global\":\"$18:1:props:children:1:0:props:children:0:props:children:1:props:global\"}]}]]}]]}]]}]}]}],[\"$\",\"p\",\"1\",{\"className\":\"_4HZoZws0 nM-XXcw8\",\"children\":[[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"Equitable Prime Rate as of October 30\"}]],[\"$\",\"sup\",\"1\",{\"children\":[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\"th\"}]]}],[[\"$\",\"$1\",\"templating-text-node-0\",{\"children\":\", 2025. \"}]]]}]]}]}]]}]\n21:[\"$\",\"section\",\"section-3\",{\"className\":\"d63g793G\",\"children\":[\"$\",\"div\",null,{\"className\":\"_3l8o1BG-\",\"children\":[\"$undefined\",\"$undefined\",false,[\"$\",\"div\",null,{\"className\":\"aA-mr9Tm\",\"children\":[[\"$\",\"$1\",\"General Mortgage Rate Information-0\",{\"children\":[[\"$\",\"$L2c\",\"section-0\",{\"anchorId\":\"General Mortgage Rate Information\",\"accordionItems\":[{\"title\":\"General Mortgage Rate Information\",\"answer\":{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"The Equitable Prime Rate (P) is the annual rate of interest that is established from time to time by Equitable Bank, at its discretion, as a point of reference, and may change at any time. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"Adjustable rate mortgages offer a variable interest rate that consists of the Equitable Prime Rate plus or minus an adjustment factor and varies automatically if and when the Equitable Prime Rate varies. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"The interest rate for adjustable rate mortgages is compounded monthly, not in advance, and charged monthly. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"The interest rate for fixed rate mortgages is compounded twice per year, not in advance, and charged at the same frequency as the payment frequency selected. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"Standard Mortgage Rates are based on our most favourable rates in Ontario and are for reference only and not guaranteed for any particular application. Interest rates are subject to applicants meeting Equitable Bank's credit granting criteria and other conditions and restrictions may apply. Interest rates are subject to change without notice at any time. \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"list-item\"}],\"nodeType\":\"unordered-list\"}],\"nodeType\":\"document\"},\"idField\":\"general-mortgage-rate-information\",\"internalName\":\"General Mortgage Rate Information\"},{\"title\":\"Equitable Prime Rate History \",\"answer\":{\"data\":{},\"content\":[{\"data\":{\"target\":{\"metadata\":{\"tags\":[],\"concepts\":[]},\"sys\":{\"space\":{\"sys\":{\"type\":\"Link\",\"linkType\":\"Space\",\"id\":\"ymwa45h4u77x\"}},\"id\":\"6MbMfqIF9RUnTY2QgiWVJL\",\"type\":\"Entry\",\"createdAt\":\"2026-06-04T17:46:33.989Z\",\"updatedAt\":\"2026-06-07T22:09:53.903Z\",\"environment\":{\"sys\":{\"id\":\"master\",\"type\":\"Link\",\"linkType\":\"Environment\"}},\"publishedVersion\":119,\"revision\":4,\"contentType\":{\"sys\":{\"type\":\"Link\",\"linkType\":\"ContentType\",\"id\":\"table\"}},\"locale\":\"en-CA\"},\"fields\":{\"internalName\":\"Equitable Bank Prime Rate History\",\"content\":{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"\",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"Effective Date \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-header-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"Equitable Prime Rate \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-header-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"October 30, 2025 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"4.45% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"September 18, 2025 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"4.70% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"March 13, 2025 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"4.95% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"January 30, 2025 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"5.20% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"December 12, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"5.45% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"October 24, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"5.95% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"September 05, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"6.45% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"July 25, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"6.70% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"June 06, 2024 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"6.95% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"July 13, 2023 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"7.20% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"June 08, 2023 \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"6.95% \",\"nodeType\":\"text\"}],\"nodeType\":\"paragraph\"}],\"nodeType\":\"table-cell\"}],\"nodeType\":\"table-row\"},{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"content\":[{\"data\":{},\"marks\":[],\"value\":\"January 26, 2023 \",\"nodeType\":\ | |
| \ No newline at end of file | ||
added
tests/fixtures/mortgage/eq-bank.json
+883 −0
@@ -0,0 +1,883 @@ | ||
| 1 | +{ | |
| 2 | + "APR-5-Year-Fixed": { | |
| 3 | + "name": "APR-5-Year-Fixed", | |
| 4 | + "rate": 5.673 | |
| 5 | + }, | |
| 6 | + "APR-1-Year-Fixed": { | |
| 7 | + "name": "APR-1-Year-Fixed", | |
| 8 | + "rate": 6.544, | |
| 9 | + "decimalPlaces": "3" | |
| 10 | + }, | |
| 11 | + "Standard-Mortgage-Rate-5-Year-Fixed": { | |
| 12 | + "name": "Standard-Mortgage-Rate-5-Year-Fixed", | |
| 13 | + "rate": 5.14 | |
| 14 | + }, | |
| 15 | + "Standard-Mortgage-Rate-1-Year-Fixed": { | |
| 16 | + "name": "Standard-Mortgage-Rate-1-Year-Fixed", | |
| 17 | + "rate": 5.04 | |
| 18 | + }, | |
| 19 | + "GIC-1-Year": { | |
| 20 | + "name": "GIC 1 Year", | |
| 21 | + "rate": 3.4 | |
| 22 | + }, | |
| 23 | + "GIC-3-Month": { | |
| 24 | + "name": "GIC 3 Month", | |
| 25 | + "rate": 2.4 | |
| 26 | + }, | |
| 27 | + "GIC-15-Month": { | |
| 28 | + "name": "GIC 15 Month", | |
| 29 | + "rate": 3.45 | |
| 30 | + }, | |
| 31 | + "GIC-3-Year-Registered": { | |
| 32 | + "name": "GIC 3 Year", | |
| 33 | + "rate": 3.8 | |
| 34 | + }, | |
| 35 | + "GIC-4-Year": { | |
| 36 | + "name": "GIC 4 Year", | |
| 37 | + "rate": 3.9 | |
| 38 | + }, | |
| 39 | + "GIC-3-Month-Registered": { | |
| 40 | + "name": "GIC 3 Month", | |
| 41 | + "rate": 2.4 | |
| 42 | + }, | |
| 43 | + "GIC-4-Year-Registered": { | |
| 44 | + "name": "GIC 4 Year", | |
| 45 | + "rate": 3.9 | |
| 46 | + }, | |
| 47 | + "GIC-9-Month": { | |
| 48 | + "name": "GIC 9 Month", | |
| 49 | + "rate": 3.1 | |
| 50 | + }, | |
| 51 | + "GIC-1-Year-Registered": { | |
| 52 | + "name": "GIC 1 Year", | |
| 53 | + "rate": 3.4 | |
| 54 | + }, | |
| 55 | + "GIC-15-Month-Registered": { | |
| 56 | + "name": "GIC 15 Month", | |
| 57 | + "rate": 3.45 | |
| 58 | + }, | |
| 59 | + "GIC-3-Year": { | |
| 60 | + "name": "GIC 3 Year", | |
| 61 | + "rate": 3.8 | |
| 62 | + }, | |
| 63 | + "GIC-2-Year-Registered": { | |
| 64 | + "name": "GIC 2 Year", | |
| 65 | + "rate": 3.65 | |
| 66 | + }, | |
| 67 | + "GIC-2-Year": { | |
| 68 | + "name": "GIC 2 Year", | |
| 69 | + "rate": 3.65 | |
| 70 | + }, | |
| 71 | + "GIC-9-Month-Registered": { | |
| 72 | + "name": "GIC 9 Month", | |
| 73 | + "rate": 3.1 | |
| 74 | + }, | |
| 75 | + "Annual-Percentage-Rate-(APR)-5-Year-Adjustable": { | |
| 76 | + "name": "Annual-Percentage-Rate-(APR)-5-Year-Adjustable", | |
| 77 | + "rate": 3.551, | |
| 78 | + "decimalPlaces": "3" | |
| 79 | + }, | |
| 80 | + "Annual-Percentage-Rate-(APR)-5-Year-Fixed": { | |
| 81 | + "name": "Annual-Percentage-Rate-(APR)-5-Year-Fixed", | |
| 82 | + "rate": 4.546 | |
| 83 | + }, | |
| 84 | + "EQB-Evolution-Suite-5-Year-Adjustable": { | |
| 85 | + "name": "EQB-Evolution-Suite-5-Year-Adjustable", | |
| 86 | + "rate": 0.95 | |
| 87 | + }, | |
| 88 | + "es-fixed-60-month": { | |
| 89 | + "name": "esFixed60Month", | |
| 90 | + "rate": 4.54 | |
| 91 | + }, | |
| 92 | + "USD-SBB-Account": { | |
| 93 | + "name": "Business US Dollar Account ", | |
| 94 | + "rate": 2.5 | |
| 95 | + }, | |
| 96 | + "Annual-Percentage-Rate-(APR)-3-Year-Fixed": { | |
| 97 | + "name": "Annual-Percentage-Rate-(APR)-3-Year-Fixed", | |
| 98 | + "rate": 4.379 | |
| 99 | + }, | |
| 100 | + "es-fixed-36-month": { | |
| 101 | + "name": "esFixed36Month", | |
| 102 | + "rate": 4.34 | |
| 103 | + }, | |
| 104 | + "Annual-Percentage-Rate-(APR)-1-Year-Fixed": { | |
| 105 | + "name": "Annual-Percentage-Rate-(APR)-1-Year-Fixed", | |
| 106 | + "rate": 6.41, | |
| 107 | + "decimalPlaces": "3" | |
| 108 | + }, | |
| 109 | + "Reverse-Mortgage-Flex-Rates-Reset-5-Year-Fixed-APR": { | |
| 110 | + "name": "Reverse-Mortgage-Flex-Rates-Reset-5-Year-Fixed-APR", | |
| 111 | + "rate": 6.28, | |
| 112 | + "decimalPlaces": "3" | |
| 113 | + }, | |
| 114 | + "Reverse-Mortgage-Flex-Rates-Reset-2-Year-Fixed-APR": { | |
| 115 | + "name": "Reverse-Mortgage-Flex-Rates-Reset-2-Year-Fixed-APR", | |
| 116 | + "rate": 6.69, | |
| 117 | + "decimalPlaces": "3" | |
| 118 | + }, | |
| 119 | + "Reverse-Mortgage-Flex-Rates-Reset-6-Month-Fixed-APR": { | |
| 120 | + "name": "Reverse-Mortgage-Flex-Rates-Reset-6-Month-Fixed-APR ", | |
| 121 | + "rate": 6.98, | |
| 122 | + "decimalPlaces": "3" | |
| 123 | + }, | |
| 124 | + "Reverse-Mortgage-Flex-Rates-Reset-5-Year-Adjustable-APR": { | |
| 125 | + "name": "Reverse-Mortgage-Flex-Rates-Reset-5-Year-Adjustable-APR", | |
| 126 | + "rate": 6.79, | |
| 127 | + "decimalPlaces": "3" | |
| 128 | + }, | |
| 129 | + "Reverse-Mortgage-Flex-Rates-Reset-3-Year-Fixed-APR": { | |
| 130 | + "name": "Reverse-Mortgage-Flex-Rates-Reset-3-Year-Fixed-APR", | |
| 131 | + "rate": 6.58, | |
| 132 | + "decimalPlaces": "3" | |
| 133 | + }, | |
| 134 | + "Reverse-Mortgage-Flex-Rates-Reset-1-Year-Fixed-APR": { | |
| 135 | + "name": "Reverse-Mortgage-Flex-Rates-Reset-1-Year-Fixed-APR", | |
| 136 | + "rate": 6.89, | |
| 137 | + "decimalPlaces": "3" | |
| 138 | + }, | |
| 139 | + "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable-APR": { | |
| 140 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable-APR", | |
| 141 | + "rate": 7.775 | |
| 142 | + }, | |
| 143 | + "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable": { | |
| 144 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Adjustable", | |
| 145 | + "rate": 3.18 | |
| 146 | + }, | |
| 147 | + "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed-APR": { | |
| 148 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed-APR", | |
| 149 | + "rate": 7.465 | |
| 150 | + }, | |
| 151 | + "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed": { | |
| 152 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-5-Year-Fixed", | |
| 153 | + "rate": 7.43 | |
| 154 | + }, | |
| 155 | + "Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed-APR": { | |
| 156 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed-APR", | |
| 157 | + "rate": 7.984 | |
| 158 | + }, | |
| 159 | + "Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed": { | |
| 160 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-3-Year-Fixed", | |
| 161 | + "rate": 7.83 | |
| 162 | + }, | |
| 163 | + "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable-APR": { | |
| 164 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable-APR", | |
| 165 | + "rate": 6.943 | |
| 166 | + }, | |
| 167 | + "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed-APR": { | |
| 168 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed-APR", | |
| 169 | + "rate": 6.357 | |
| 170 | + }, | |
| 171 | + "Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed-APR": { | |
| 172 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed-APR", | |
| 173 | + "rate": 6.782 | |
| 174 | + }, | |
| 175 | + "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable": { | |
| 176 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Adjustable", | |
| 177 | + "rate": 2.34 | |
| 178 | + }, | |
| 179 | + "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed": { | |
| 180 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-5-Year-Fixed", | |
| 181 | + "rate": 6.28 | |
| 182 | + }, | |
| 183 | + "Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed": { | |
| 184 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-3-Year-Fixed", | |
| 185 | + "rate": 6.58 | |
| 186 | + }, | |
| 187 | + "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable-APR": { | |
| 188 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable-APR", | |
| 189 | + "rate": 6.903 | |
| 190 | + }, | |
| 191 | + "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed-APR": { | |
| 192 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed-APR", | |
| 193 | + "rate": 6.309 | |
| 194 | + }, | |
| 195 | + "Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed-APR": { | |
| 196 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed-APR", | |
| 197 | + "rate": 6.753 | |
| 198 | + }, | |
| 199 | + "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable": { | |
| 200 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Adjustable", | |
| 201 | + "rate": 2.3 | |
| 202 | + }, | |
| 203 | + "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed": { | |
| 204 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-5-Year-Fixed", | |
| 205 | + "rate": 6.23 | |
| 206 | + }, | |
| 207 | + "Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed": { | |
| 208 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-3-Year-Fixed", | |
| 209 | + "rate": 6.55 | |
| 210 | + }, | |
| 211 | + "gic-1-year-non-registered": { | |
| 212 | + "name": "GIC 1 Year", | |
| 213 | + "rate": 3.3 | |
| 214 | + }, | |
| 215 | + "equitable-prime-rate": { | |
| 216 | + "name": "Equitable-Prime-Rate", | |
| 217 | + "rate": 4.45 | |
| 218 | + }, | |
| 219 | + "es-fixed-48-month": { | |
| 220 | + "name": "esFixed48Month", | |
| 221 | + "rate": 4.64 | |
| 222 | + }, | |
| 223 | + "es-fixed-24-month": { | |
| 224 | + "name": "esFixed24Month", | |
| 225 | + "rate": 5.39 | |
| 226 | + }, | |
| 227 | + "es-fixed-12-month": { | |
| 228 | + "name": "esFixed12Month", | |
| 229 | + "rate": 6.29 | |
| 230 | + }, | |
| 231 | + "corporate-series-f-usd": { | |
| 232 | + "name": "corporate-series-f-usd", | |
| 233 | + "rate": 3 | |
| 234 | + }, | |
| 235 | + "corporate-series-a-usd": { | |
| 236 | + "name": "corporate-series-a-usd", | |
| 237 | + "rate": 2.9 | |
| 238 | + }, | |
| 239 | + "personal-series-f-usd": { | |
| 240 | + "name": "personal-series-f-usd", | |
| 241 | + "rate": 3.05 | |
| 242 | + }, | |
| 243 | + "personal-series-a-usd": { | |
| 244 | + "name": "personal-series-a-usd", | |
| 245 | + "rate": 2.9 | |
| 246 | + }, | |
| 247 | + "corporate-series-f": { | |
| 248 | + "name": "corporate-series-f", | |
| 249 | + "rate": 1.9 | |
| 250 | + }, | |
| 251 | + "corporate-series-a": { | |
| 252 | + "name": "corporate-series-a", | |
| 253 | + "rate": 1.8 | |
| 254 | + }, | |
| 255 | + "personal-series-f": { | |
| 256 | + "name": "personal-series-f", | |
| 257 | + "rate": 2.05 | |
| 258 | + }, | |
| 259 | + "personal-series-a": { | |
| 260 | + "name": "personal-series-a", | |
| 261 | + "rate": 1.9 | |
| 262 | + }, | |
| 263 | + "hisa-usd-eqb": { | |
| 264 | + "name": "hisa-usd-eqb", | |
| 265 | + "rate": 2.9 | |
| 266 | + }, | |
| 267 | + "hisa-cad-eqb": { | |
| 268 | + "name": "hisa-cad-eqb", | |
| 269 | + "rate": 1.9 | |
| 270 | + }, | |
| 271 | + "mortgage-rate-variable-5-year-apr": { | |
| 272 | + "name": "Variable APR Mortgage Rate", | |
| 273 | + "rate": 4.05 | |
| 274 | + }, | |
| 275 | + "mortgage-rate-variable-5-year": { | |
| 276 | + "name": "Variable Mortgage Rate", | |
| 277 | + "rate": 4 | |
| 278 | + }, | |
| 279 | + "mortgage-rate-fixed-5-year-apr": { | |
| 280 | + "name": "Fixed APR Mortgage Rate", | |
| 281 | + "rate": 4.06 | |
| 282 | + }, | |
| 283 | + "mortgage-rate-fixed-5-year": { | |
| 284 | + "name": "Fixed Mortgage Rate", | |
| 285 | + "rate": 4.04 | |
| 286 | + }, | |
| 287 | + "RRSP-Cash-Savings-Account": { | |
| 288 | + "name": "RRSP Cash Savings Account", | |
| 289 | + "rate": 1.5 | |
| 290 | + }, | |
| 291 | + "US-Dollar-Account": { | |
| 292 | + "name": "US Dollar Account", | |
| 293 | + "rate": 2.5 | |
| 294 | + }, | |
| 295 | + "SBB-cash-back": { | |
| 296 | + "name": "SBB-cash-back", | |
| 297 | + "rate": 1 | |
| 298 | + }, | |
| 299 | + "APR-2-Year-Fixed": { | |
| 300 | + "name": "APR-2-Year-Fixed", | |
| 301 | + "rate": 5.951 | |
| 302 | + }, | |
| 303 | + "Standard-Mortgage-Rate-2-Year-Fixed": { | |
| 304 | + "name": "Standard-Mortgage-Rate-2-Year-Fixed", | |
| 305 | + "rate": 5.14 | |
| 306 | + }, | |
| 307 | + "EQB-Evolution-Suite-6-Month-Fixed": { | |
| 308 | + "name": "EQB-Evolution-Suite-6-month-Fixed", | |
| 309 | + "rate": 7.54 | |
| 310 | + }, | |
| 311 | + "Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed-APR": { | |
| 312 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed-APR", | |
| 313 | + "rate": 6.792 | |
| 314 | + }, | |
| 315 | + "Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed-APR": { | |
| 316 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed-APR", | |
| 317 | + "rate": 7.512 | |
| 318 | + }, | |
| 319 | + "Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed-APR": { | |
| 320 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed-APR", | |
| 321 | + "rate": 8.569 | |
| 322 | + }, | |
| 323 | + "Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed": { | |
| 324 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-2-Year-Fixed", | |
| 325 | + "rate": 6.49 | |
| 326 | + }, | |
| 327 | + "Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed": { | |
| 328 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-1-Year-Fixed", | |
| 329 | + "rate": 6.79 | |
| 330 | + }, | |
| 331 | + "Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed": { | |
| 332 | + "name": "Reverse-Mortgage-Flex-Lite-Rate-6-Month-Fixed", | |
| 333 | + "rate": 6.88 | |
| 334 | + }, | |
| 335 | + "Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed-APR": { | |
| 336 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed-APR", | |
| 337 | + "rate": 8.186 | |
| 338 | + }, | |
| 339 | + "Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed-APR": { | |
| 340 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed-APR", | |
| 341 | + "rate": 8.808 | |
| 342 | + }, | |
| 343 | + "Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed-APR": { | |
| 344 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed-APR", | |
| 345 | + "rate": 9.634 | |
| 346 | + }, | |
| 347 | + "Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed": { | |
| 348 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-2-Year-Fixed", | |
| 349 | + "rate": 7.94 | |
| 350 | + }, | |
| 351 | + "Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed": { | |
| 352 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-1-Year-Fixed", | |
| 353 | + "rate": 8.14 | |
| 354 | + }, | |
| 355 | + "Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed": { | |
| 356 | + "name": "Reverse-Mortgage-Flex-PLUS-Rate-6-Month-Fixed", | |
| 357 | + "rate": 7.98 | |
| 358 | + }, | |
| 359 | + "Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed-APR": { | |
| 360 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed-APR", | |
| 361 | + "rate": 6.985 | |
| 362 | + }, | |
| 363 | + "Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed-APR": { | |
| 364 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed-APR", | |
| 365 | + "rate": 7.608 | |
| 366 | + }, | |
| 367 | + "Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed": { | |
| 368 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-2-Year-Fixed", | |
| 369 | + "rate": 6.69 | |
| 370 | + }, | |
| 371 | + "Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed": { | |
| 372 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-1-Year-Fixed", | |
| 373 | + "rate": 6.89 | |
| 374 | + }, | |
| 375 | + "Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed-APR": { | |
| 376 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed-APR", | |
| 377 | + "rate": 8.666 | |
| 378 | + }, | |
| 379 | + "Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed": { | |
| 380 | + "name": "Reverse-Mortgage-Flex-Rates-Origination-6-Month-Fixed", | |
| 381 | + "rate": 6.98 | |
| 382 | + }, | |
| 383 | + "Annual-Percentage-Rate-(APR)-4-Year-Fixed": { | |
| 384 | + "name": "Annual-Percentage-Rate-(APR)-4-Year-Fixed", | |
| 385 | + "rate": 4.648 | |
| 386 | + }, | |
| 387 | + "Annual-Percentage-Rate-(APR)-2-Year-Fixed": { | |
| 388 | + "name": "Annual-Percentage-Rate-(APR)-2-Year-Fixed", | |
| 389 | + "rate": 5.432 | |
| 390 | + }, | |
| 391 | + "APR-5-Year-Adjustable": { | |
| 392 | + "name": "APR-5-Year-Adjustable", | |
| 393 | + "rate": 4.999 | |
| 394 | + }, | |
| 395 | + "APR-4-Year-Fixed": { | |
| 396 | + "name": "APR-4-Year-Fixed", | |
| 397 | + "rate": 6.416 | |
| 398 | + }, | |
| 399 | + "APR-3-Year-Fixed": { | |
| 400 | + "name": "APR-3-Year-Fixed", | |
| 401 | + "rate": 5.847 | |
| 402 | + }, | |
| 403 | + "Standard-Mortgage-Rate-5-Year-Adjustable": { | |
| 404 | + "name": "Standard-Mortgage-Rate-5-Year-Adjustable", | |
| 405 | + "rate": 0.04 | |
| 406 | + }, | |
| 407 | + "Standard-Mortgage-Rate-4-Year-Fixed": { | |
| 408 | + "name": "Standard-Mortgage-Rate-4-Year-Fixed", | |
| 409 | + "rate": 6.19 | |
| 410 | + }, | |
| 411 | + "Standard-Mortgage-Rate-3-Year-Fixed": { | |
| 412 | + "name": "Standard-Mortgage-Rate-3-Year-Fixed", | |
| 413 | + "rate": 5.24 | |
| 414 | + }, | |
| 415 | + "GIC-10-Year-Registered": { | |
| 416 | + "name": "GIC 10 Year", | |
| 417 | + "rate": 2.35 | |
| 418 | + }, | |
| 419 | + "GIC-7-Year-Registered": { | |
| 420 | + "name": "GIC 7 Year", | |
| 421 | + "rate": 2.35 | |
| 422 | + }, | |
| 423 | + "GIC-5-Year-Registered": { | |
| 424 | + "name": "GIC 5 Year", | |
| 425 | + "rate": 4 | |
| 426 | + }, | |
| 427 | + "GIC-27-Month-Registered": { | |
| 428 | + "name": "GIC 27 Month", | |
| 429 | + "rate": 3.7 | |
| 430 | + }, | |
| 431 | + "GIC-6-Month-Registered": { | |
| 432 | + "name": "GIC 6 Month", | |
| 433 | + "rate": 2.75 | |
| 434 | + }, | |
| 435 | + "Business-account": { | |
| 436 | + "name": "sbb", | |
| 437 | + "rate": 2.25 | |
| 438 | + }, | |
| 439 | + "Joint-Account-Base-Rate": { | |
| 440 | + "name": "Joint Account Base Rate ", | |
| 441 | + "rate": 1 | |
| 442 | + }, | |
| 443 | + "GIC-6-Year-Registered": { | |
| 444 | + "name": "GIC 6 Year", | |
| 445 | + "rate": 2.35 | |
| 446 | + }, | |
| 447 | + "Personal-Account-Base-Rate": { | |
| 448 | + "name": "Personal Account Base Rate ", | |
| 449 | + "rate": 1 | |
| 450 | + }, | |
| 451 | + "30 Day-Notice-Savings-Account": { | |
| 452 | + "name": "30 Day Notice Savings Account", | |
| 453 | + "rate": 2.75 | |
| 454 | + }, | |
| 455 | + "GIC-6-Month": { | |
| 456 | + "name": "GIC 6 Month", | |
| 457 | + "rate": 2.75 | |
| 458 | + }, | |
| 459 | + "GIC-27-Month": { | |
| 460 | + "name": "GIC 27 Month", | |
| 461 | + "rate": 3.7 | |
| 462 | + }, | |
| 463 | + "GIC-7-Year": { | |
| 464 | + "name": "GIC 7 Year", | |
| 465 | + "rate": 2.35 | |
| 466 | + }, | |
| 467 | + "GIC-5-Year": { | |
| 468 | + "name": "GIC 5 Year", | |
| 469 | + "rate": 4 | |
| 470 | + }, | |
| 471 | + "GIC-6-Year": { | |
| 472 | + "name": "GIC 6 Year", | |
| 473 | + "rate": 2.35 | |
| 474 | + }, | |
| 475 | + "GIC-10-Year": { | |
| 476 | + "name": "GIC 10 Year", | |
| 477 | + "rate": 2.35 | |
| 478 | + }, | |
| 479 | + "10 Day-Notice-Savings-Account": { | |
| 480 | + "name": "10 Day Notice Savings Account", | |
| 481 | + "rate": 2.35 | |
| 482 | + }, | |
| 483 | + "Joint-Account-Payroll-Account": { | |
| 484 | + "name": "Joint Account Payroll Account", | |
| 485 | + "rate": 2.75 | |
| 486 | + }, | |
| 487 | + "Personal-Account-Payroll-Rate": { | |
| 488 | + "name": "Personal Account Payroll Rate", | |
| 489 | + "rate": 2.75 | |
| 490 | + }, | |
| 491 | + "Personal-Account-bonus-interest-rate": { | |
| 492 | + "name": "Personal Account bonus interest rate", | |
| 493 | + "rate": 1.75 | |
| 494 | + }, | |
| 495 | + "Joint-Account-bonus-interest-rate": { | |
| 496 | + "name": "Joint Account bonus interest rate", | |
| 497 | + "rate": 1.75 | |
| 498 | + }, | |
| 499 | + "TFSA-Cash-Savings-Account": { | |
| 500 | + "name": "TFSA Cash Savings Account", | |
| 501 | + "rate": 1.5 | |
| 502 | + }, | |
| 503 | + "FHSA-cash-savings-account": { | |
| 504 | + "name": "FHSA Cash Savings Account", | |
| 505 | + "rate": 1.5 | |
| 506 | + }, | |
| 507 | + "cannex-annual-1-yr": { | |
| 508 | + "name": "cannex-annual-1-yr", | |
| 509 | + "rate": 3.01 | |
| 510 | + }, | |
| 511 | + "cannex-annual-2-yr": { | |
| 512 | + "name": "cannex-annual-2-yr", | |
| 513 | + "rate": 3.69 | |
| 514 | + }, | |
| 515 | + "cannex-annual-3-yr": { | |
| 516 | + "name": "cannex-annual-3-yr", | |
| 517 | + "rate": 3.96 | |
| 518 | + }, | |
| 519 | + "cannex-annual-4-yr": { | |
| 520 | + "name": "cannex-annual-4-yr", | |
| 521 | + "rate": 4.04 | |
| 522 | + }, | |
| 523 | + "cannex-annual-5-yr": { | |
| 524 | + "name": "cannex-annual-5-yr", | |
| 525 | + "rate": 4.16 | |
| 526 | + }, | |
| 527 | + "cannex-annual-6-yr": { | |
| 528 | + "name": "cannex-annual-6-yr", | |
| 529 | + "rate": 2.25 | |
| 530 | + }, | |
| 531 | + "cannex-annual-7-yr": { | |
| 532 | + "name": "cannex-annual-7-yr", | |
| 533 | + "rate": 2.25 | |
| 534 | + }, | |
| 535 | + "cannex-annual-8-yr": { | |
| 536 | + "name": "cannex-annual-8-yr", | |
| 537 | + "rate": 2.25 | |
| 538 | + }, | |
| 539 | + "cannex-annual-9-yr": { | |
| 540 | + "name": "cannex-annual-9-yr", | |
| 541 | + "rate": 2.25 | |
| 542 | + }, | |
| 543 | + "cannex-annual-10-yr": { | |
| 544 | + "name": "cannex-annual-10-yr", | |
| 545 | + "rate": 2.25 | |
| 546 | + }, | |
| 547 | + "cannex-semi-annual-1-yr": { | |
| 548 | + "name": "cannex-semi-annual-1-yr", | |
| 549 | + "rate": 2.97 | |
| 550 | + }, | |
| 551 | + "cannex-semi-annual-2-yr": { | |
| 552 | + "name": "cannex-semi-annual-2-yr", | |
| 553 | + "rate": 3.65 | |
| 554 | + }, | |
| 555 | + "cannex-semi-annual-3-yr": { | |
| 556 | + "name": "cannex-semi-annual-3-yr", | |
| 557 | + "rate": 3.92 | |
| 558 | + }, | |
| 559 | + "cannex-semi-annual-4-yr": { | |
| 560 | + "name": "cannex-semi-annual-4-yr", | |
| 561 | + "rate": 4 | |
| 562 | + }, | |
| 563 | + "cannex-semi-annual-5-yr": { | |
| 564 | + "name": "cannex-semi-annual-5-yr", | |
| 565 | + "rate": 4.12 | |
| 566 | + }, | |
| 567 | + "cannex-semi-annual-6-yr": { | |
| 568 | + "name": "cannex-semi-annual-6-yr", | |
| 569 | + "rate": 2.21 | |
| 570 | + }, | |
| 571 | + "cannex-semi-annual-7-yr": { | |
| 572 | + "name": "cannex-semi-annual-7-yr", | |
| 573 | + "rate": 2.21 | |
| 574 | + }, | |
| 575 | + "cannex-semi-annual-8-yr": { | |
| 576 | + "name": "cannex-semi-annual-8-yr", | |
| 577 | + "rate": 2.21 | |
| 578 | + }, | |
| 579 | + "cannex-semi-annual-9-yr": { | |
| 580 | + "name": "cannex-semi-annual-9-yr", | |
| 581 | + "rate": 2.21 | |
| 582 | + }, | |
| 583 | + "cannex-semi-annual-10-yr": { | |
| 584 | + "name": "cannex-semi-annual-10-yr", | |
| 585 | + "rate": 2.21 | |
| 586 | + }, | |
| 587 | + "cannex-quarterly-1-yr": { | |
| 588 | + "name": "cannex-quarterly-1-yr", | |
| 589 | + "rate": 2.94 | |
| 590 | + }, | |
| 591 | + "cannex-quarterly-2-yr": { | |
| 592 | + "name": "cannex-quarterly-2-yr", | |
| 593 | + "rate": 3.62 | |
| 594 | + }, | |
| 595 | + "cannex-quarterly-3-yr": { | |
| 596 | + "name": "cannex-quarterly-3-yr", | |
| 597 | + "rate": 3.89 | |
| 598 | + }, | |
| 599 | + "cannex-quarterly-4-yr": { | |
| 600 | + "name": "cannex-quarterly-4-yr", | |
| 601 | + "rate": 3.97 | |
| 602 | + }, | |
| 603 | + "cannex-quarterly-5-yr": { | |
| 604 | + "name": "cannex-quarterly-5-yr", | |
| 605 | + "rate": 4.09 | |
| 606 | + }, | |
| 607 | + "cannex-quarterly-6-yr": { | |
| 608 | + "name": "cannex-quarterly-6-yr", | |
| 609 | + "rate": 2.18 | |
| 610 | + }, | |
| 611 | + "cannex-quarterly-7-yr": { | |
| 612 | + "name": "cannex-quarterly-7-yr", | |
| 613 | + "rate": 2.18 | |
| 614 | + }, | |
| 615 | + "cannex-quarterly-8-yr": { | |
| 616 | + "name": "cannex-quarterly-8-yr", | |
| 617 | + "rate": 2.18 | |
| 618 | + }, | |
| 619 | + "cannex-quarterly-9-yr": { | |
| 620 | + "name": "cannex-quarterly-9-yr", | |
| 621 | + "rate": 2.18 | |
| 622 | + }, | |
| 623 | + "cannex-quarterly-10-yr": { | |
| 624 | + "name": "cannex-quarterly-10-yr", | |
| 625 | + "rate": 2.18 | |
| 626 | + }, | |
| 627 | + "cannex-monthly-1-yr": { | |
| 628 | + "name": "cannex-monthly-1-yr", | |
| 629 | + "rate": 2.92 | |
| 630 | + }, | |
| 631 | + "cannex-monthly-2-yr": { | |
| 632 | + "name": "cannex-monthly-2-yr", | |
| 633 | + "rate": 3.6 | |
| 634 | + }, | |
| 635 | + "cannex-monthly-3-yr": { | |
| 636 | + "name": "cannex-monthly-3-yr", | |
| 637 | + "rate": 3.87 | |
| 638 | + }, | |
| 639 | + "cannex-monthly-4-yr": { | |
| 640 | + "name": "cannex-monthly-4-yr", | |
| 641 | + "rate": 3.95 | |
| 642 | + }, | |
| 643 | + "cannex-monthly-5-yr": { | |
| 644 | + "name": "cannex-monthly-5-yr", | |
| 645 | + "rate": 4.07 | |
| 646 | + }, | |
| 647 | + "cannex-monthly-6-yr": { | |
| 648 | + "name": "cannex-monthly-6-yr", | |
| 649 | + "rate": 2.16 | |
| 650 | + }, | |
| 651 | + "cannex-monthly-7-yr": { | |
| 652 | + "name": "cannex-monthly-7-yr", | |
| 653 | + "rate": 2.16 | |
| 654 | + }, | |
| 655 | + "cannex-monthly-8-yr": { | |
| 656 | + "name": "cannex-monthly-8-yr", | |
| 657 | + "rate": 2.16 | |
| 658 | + }, | |
| 659 | + "cannex-monthly-9-yr": { | |
| 660 | + "name": "cannex-monthly-9-yr", | |
| 661 | + "rate": 2.16 | |
| 662 | + }, | |
| 663 | + "cannex-monthly-10-yr": { | |
| 664 | + "name": "cannex-monthly-10-yr", | |
| 665 | + "rate": 2.16 | |
| 666 | + }, | |
| 667 | + "cannex-cacheable": { | |
| 668 | + "name": "cannex-cacheable", | |
| 669 | + "rate": 1.5 | |
| 670 | + }, | |
| 671 | + "cannex-ustd-annual-1-yr": { | |
| 672 | + "name": "cannex-ustd-annual-1-yr", | |
| 673 | + "rate": 4.1 | |
| 674 | + }, | |
| 675 | + "cannex-ustd-annual-2-yr": { | |
| 676 | + "name": "cannex-ustd-annual-2-yr", | |
| 677 | + "rate": 3.95 | |
| 678 | + }, | |
| 679 | + "cannex-ustd-annual-3-yr": { | |
| 680 | + "name": "cannex-ustd-annual-3-yr", | |
| 681 | + "rate": 3.95 | |
| 682 | + }, | |
| 683 | + "cannex-ustd-annual-4-yr": { | |
| 684 | + "name": "cannex-ustd-annual-4-yr", | |
| 685 | + "rate": 4 | |
| 686 | + }, | |
| 687 | + "cannex-ustd-annual-5-yr": { | |
| 688 | + "name": "cannex-ustd-annual-5-yr", | |
| 689 | + "rate": 4.05 | |
| 690 | + }, | |
| 691 | + "cannex-ustd-annual-6-yr": { | |
| 692 | + "name": "cannex-ustd-annual-6-yr", | |
| 693 | + "rate": 2.5 | |
| 694 | + }, | |
| 695 | + "cannex-ustd-annual-7-yr": { | |
| 696 | + "name": "cannex-ustd-annual-7-yr", | |
| 697 | + "rate": 2.5 | |
| 698 | + }, | |
| 699 | + "cannex-ustd-annual-8-yr": { | |
| 700 | + "name": "cannex-ustd-annual-8-yr", | |
| 701 | + "rate": 2.5 | |
| 702 | + }, | |
| 703 | + "cannex-ustd-annual-9-yr": { | |
| 704 | + "name": "cannex-ustd-annual-9-yr", | |
| 705 | + "rate": 2.5 | |
| 706 | + }, | |
| 707 | + "cannex-ustd-annual-10-yr": { | |
| 708 | + "name": "cannex-ustd-annual-10-yr", | |
| 709 | + "rate": 2.5 | |
| 710 | + }, | |
| 711 | + "cannex-ustd-semi-annual-1-yr": { | |
| 712 | + "name": "cannex-ustd-semi-annual-1-yr", | |
| 713 | + "rate": 4.06 | |
| 714 | + }, | |
| 715 | + "cannex-ustd-semi-annual-2-yr": { | |
| 716 | + "name": "cannex-ustd-semi-annual-2-yr", | |
| 717 | + "rate": 3.91 | |
| 718 | + }, | |
| 719 | + "cannex-ustd-semi-annual-3-yr": { | |
| 720 | + "name": "cannex-ustd-semi-annual-3-yr", | |
| 721 | + "rate": 3.91 | |
| 722 | + }, | |
| 723 | + "cannex-ustd-semi-annual-4-yr": { | |
| 724 | + "name": "cannex-ustd-semi-annual-4-yr", | |
| 725 | + "rate": 3.96 | |
| 726 | + }, | |
| 727 | + "cannex-ustd-semi-annual-5-yr": { | |
| 728 | + "name": "cannex-ustd-semi-annual-5-yr", | |
| 729 | + "rate": 4.01 | |
| 730 | + }, | |
| 731 | + "cannex-ustd-semi-annual-6-yr": { | |
| 732 | + "name": "cannex-ustd-semi-annual-6-yr", | |
| 733 | + "rate": 2.46 | |
| 734 | + }, | |
| 735 | + "cannex-ustd-semi-annual-7-yr": { | |
| 736 | + "name": "cannex-ustd-semi-annual-7-yr", | |
| 737 | + "rate": 2.46 | |
| 738 | + }, | |
| 739 | + "cannex-ustd-semi-annual-8-yr": { | |
| 740 | + "name": "cannex-ustd-semi-annual-8-yr", | |
| 741 | + "rate": 2.46 | |
| 742 | + }, | |
| 743 | + "cannex-ustd-semi-annual-9-yr": { | |
| 744 | + "name": "cannex-ustd-semi-annual-9-yr", | |
| 745 | + "rate": 2.46 | |
| 746 | + }, | |
| 747 | + "cannex-ustd-semi-annual-10-yr": { | |
| 748 | + "name": "cannex-ustd-semi-annual-10-yr", | |
| 749 | + "rate": 2.46 | |
| 750 | + }, | |
| 751 | + "cannex-ustd-quarterly-1-yr": { | |
| 752 | + "name": "cannex-ustd-quarterly-1-yr", | |
| 753 | + "rate": 4.03 | |
| 754 | + }, | |
| 755 | + "cannex-ustd-quarterly-2-yr": { | |
| 756 | + "name": "cannex-ustd-quarterly-2-yr", | |
| 757 | + "rate": 3.88 | |
| 758 | + }, | |
| 759 | + "cannex-ustd-quarterly-3-yr": { | |
| 760 | + "name": "cannex-ustd-quarterly-3-yr", | |
| 761 | + "rate": 3.88 | |
| 762 | + }, | |
| 763 | + "cannex-ustd-quarterly-4-yr": { | |
| 764 | + "name": "cannex-ustd-quarterly-4-yr", | |
| 765 | + "rate": 3.93 | |
| 766 | + }, | |
| 767 | + "cannex-ustd-quarterly-5-yr": { | |
| 768 | + "name": "cannex-ustd-quarterly-5-yr", | |
| 769 | + "rate": 3.98 | |
| 770 | + }, | |
| 771 | + "cannex-ustd-quarterly-6-yr": { | |
| 772 | + "name": "cannex-ustd-quarterly-6-yr", | |
| 773 | + "rate": 2.43 | |
| 774 | + }, | |
| 775 | + "cannex-ustd-quarterly-7-yr": { | |
| 776 | + "name": "cannex-ustd-quarterly-7-yr", | |
| 777 | + "rate": 2.43 | |
| 778 | + }, | |
| 779 | + "cannex-ustd-quarterly-8-yr": { | |
| 780 | + "name": "cannex-ustd-quarterly-8-yr", | |
| 781 | + "rate": 2.43 | |
| 782 | + }, | |
| 783 | + "cannex-ustd-quarterly-9-yr": { | |
| 784 | + "name": "cannex-ustd-quarterly-9-yr", | |
| 785 | + "rate": 2.43 | |
| 786 | + }, | |
| 787 | + "cannex-ustd-quarterly-10-yr": { | |
| 788 | + "name": "cannex-ustd-quarterly-10-yr", | |
| 789 | + "rate": 2.43 | |
| 790 | + }, | |
| 791 | + "cannex-ustd-monthly-1-yr": { | |
| 792 | + "name": "cannex-ustd-monthly-1-yr", | |
| 793 | + "rate": 4.01 | |
| 794 | + }, | |
| 795 | + "cannex-ustd-monthly-2-yr": { | |
| 796 | + "name": "cannex-ustd-monthly-2-yr", | |
| 797 | + "rate": 3.86 | |
| 798 | + }, | |
| 799 | + "cannex-ustd-monthly-3-yr": { | |
| 800 | + "name": "cannex-ustd-monthly-3-yr", | |
| 801 | + "rate": 3.86 | |
| 802 | + }, | |
| 803 | + "cannex-ustd-monthly-4-yr": { | |
| 804 | + "name": "cannex-ustd-monthly-4-yr", | |
| 805 | + "rate": 3.91 | |
| 806 | + }, | |
| 807 | + "cannex-ustd-monthly-5-yr": { | |
| 808 | + "name": "cannex-ustd-monthly-5-yr", | |
| 809 | + "rate": 3.96 | |
| 810 | + }, | |
| 811 | + "cannex-ustd-monthly-6-yr": { | |
| 812 | + "name": "cannex-ustd-monthly-6-yr", | |
| 813 | + "rate": 2.41 | |
| 814 | + }, | |
| 815 | + "cannex-ustd-monthly-7-yr": { | |
| 816 | + "name": "cannex-ustd-monthly-7-yr", | |
| 817 | + "rate": 2.41 | |
| 818 | + }, | |
| 819 | + "cannex-ustd-monthly-8-yr": { | |
| 820 | + "name": "cannex-ustd-monthly-8-yr", | |
| 821 | + "rate": 2.41 | |
| 822 | + }, | |
| 823 | + "cannex-ustd-monthly-9-yr": { | |
| 824 | + "name": "cannex-ustd-monthly-9-yr", | |
| 825 | + "rate": 2.41 | |
| 826 | + }, | |
| 827 | + "cannex-ustd-monthly-10-yr": { | |
| 828 | + "name": "cannex-ustd-monthly-10-yr", | |
| 829 | + "rate": 2.41 | |
| 830 | + }, | |
| 831 | + "cannex-ustd-cacheable": { | |
| 832 | + "name": "cannex-ustd-cacheable", | |
| 833 | + "rate": 1.75 | |
| 834 | + }, | |
| 835 | + "cannex-short-term-30-days": { | |
| 836 | + "name": "cannex-short-term-30-days", | |
| 837 | + "rate": 0.2 | |
| 838 | + }, | |
| 839 | + "cannex-short-term-60-days": { | |
| 840 | + "name": "cannex-short-term-60-days", | |
| 841 | + "rate": 0.8 | |
| 842 | + }, | |
| 843 | + "cannex-short-term-90-days": { | |
| 844 | + "name": "cannex-short-term-90-days", | |
| 845 | + "rate": 2.15 | |
| 846 | + }, | |
| 847 | + "cannex-short-term-120-days": { | |
| 848 | + "name": "cannex-short-term-120-days", | |
| 849 | + "rate": 2.2 | |
| 850 | + }, | |
| 851 | + "cannex-short-term-180-days": { | |
| 852 | + "name": "cannex-short-term-180-days", | |
| 853 | + "rate": 2.7 | |
| 854 | + }, | |
| 855 | + "cannex-short-term-270-days": { | |
| 856 | + "name": "cannex-short-term-270-days", | |
| 857 | + "rate": 2.8 | |
| 858 | + }, | |
| 859 | + "cannex-ustd-short-term-30-days": { | |
| 860 | + "name": "cannex-ustd-short-term-30-days", | |
| 861 | + "rate": 0.05 | |
| 862 | + }, | |
| 863 | + "cannex-ustd-short-term-60-days": { | |
| 864 | + "name": "cannex-ustd-short-term-60-days", | |
| 865 | + "rate": 1 | |
| 866 | + }, | |
| 867 | + "cannex-ustd-short-term-90-days": { | |
| 868 | + "name": "cannex-ustd-short-term-90-days", | |
| 869 | + "rate": 2.95 | |
| 870 | + }, | |
| 871 | + "cannex-ustd-short-term-120-days": { | |
| 872 | + "name": "cannex-ustd-short-term-120-days", | |
| 873 | + "rate": 3 | |
| 874 | + }, | |
| 875 | + "cannex-ustd-short-term-180-days": { | |
| 876 | + "name": "cannex-ustd-short-term-180-days", | |
| 877 | + "rate": 3.15 | |
| 878 | + }, | |
| 879 | + "cannex-ustd-short-term-270-days": { | |
| 880 | + "name": "cannex-ustd-short-term-270-days", | |
| 881 | + "rate": 3.3 | |
| 882 | + } | |
| 883 | +} | |
| \ No newline at end of file | ||
added
tests/fixtures/mortgage/first-national.html
+1654 −0
@@ -0,0 +1,1654 @@ | ||
| 1 | + <!DOCTYPE html> <html prefix="og: http://ogp.me/ns#" lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="format-detection" content="telephone=no"> <title> | |
| 2 | + Mortgage rates - gain insight into costs at each stage of your mortgage | |
| 3 | +</title> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': | |
| 4 | + new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], | |
| 5 | + j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= | |
| 6 | + 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); | |
| 7 | + })(window,document,'script','dataLayer','GTM-NKTBZWG');</script> <!-- End Google Tag Manager --> <link href="https://cloud.typography.com/7553114/7403352/css/fonts.css" rel="stylesheet" type="text/css" /><link href="/ResourcePackages/FirstNationalBootstrap/assets/dist/css/styles.min.css?v=639227790237590839" rel="stylesheet" type="text/css" /> <meta property="og:title" content="Mortgage rates - gain insight into costs at each stage of your mortgage" /><meta property="og:description" content="First National’s rates for qualified residential mortgages." /><meta property="og:url" content="https://www.firstnational.ca/residential/mortgage-rates" /><meta property="og:type" content="website" /><meta property="og:site_name" content="Default" /><style type="text/css" media="all">.cookie-message { | |
| 8 | + padding: 15px; | |
| 9 | + background-color: #036936; | |
| 10 | + color: #ffffff; | |
| 11 | + margin-bottom: 5px; | |
| 12 | + font-size: 14px; | |
| 13 | + display: none; | |
| 14 | + width: 100%; | |
| 15 | +} | |
| 16 | + | |
| 17 | +.cookie-message a, .cookie-message a:hover, .cookie-message a:focus { color: #fff; text-decoration: underline; transition: 0.25s opacity ease-in; } .cookie-message a:hover, .cookie-message a:focus { opacity: 0.75; } .cookie-message .cookie-close-button { background-color: #eee; border-color: #eee; color: #036936; text-decoration: none; } .cookie-message .cookie-close-button:hover, .cookie-message .cookie-close-button:focus { text-decoration: none; color: #036936; } .covid-19-message { height: 0; overflow: hidden; transition: 0.2s height ease; } .covid-19-message.js-enable { height: auto; padding: 15px 0px 10px; } .covid-19-message.js-minimized .content-wrapper { display: none; } .covid-19-message .covid19-expand-button, .covid-19-message.js-minimized .content-wrapper, .covid-19-message.js-minimized .covid19-close-button { display: none; } .covid-19-message .covid19-close-button, .covid-19-message.js-minimized .covid19-expand-button { display: inline-block; } .covid19-expand-button { padding-left: 1rem; padding-right: 1rem; margin-top: 0; font-size: 12px; color: #fff !important; text-decoration: none; } .covid19-expand-button:hover, .covid19-expand-button:focus { opacity: 0.75; } .covid-19-message.js-minimized h4, .covid-19-message.js-minimized .content-wrapper + p { margin: 0; } .covid-19-message.js-minimized h4 { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; } @media (max-width: 767px) { .covid-19-message.js-minimized h4 { font-size: 1.25rem; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; } .covid-19-message.js-minimized h4 > .inner-wrapper { width: 100%; } .covid-19-message.js-minimized .covid19-expand-button { margin-top: 1rem; text-align: center; font-size: 9px; } }.v-commercialcontent__body, .v-commercialcontent__header { grid-template-columns: repeat(auto-fill,minmax(25rem,1fr));}</style><style type="text/css" media="all">@media screen and (min-width: 1200px) { | |
| 18 | + html[lang="fr"] .c-menu-primary__link { | |
| 19 | + font-size: 1.8rem; | |
| 20 | + } | |
| 21 | +} | |
| 22 | + | |
| 23 | +.o-button--link:hover { | |
| 24 | + background-color: transparent; | |
| 25 | + color: #363636; | |
| 26 | + opacity: .8; | |
| 27 | +} | |
| 28 | +.col-sm-auto { | |
| 29 | + width: auto; | |
| 30 | +} | |
| 31 | +.o-button--secondary:hover { | |
| 32 | + background-color: transparent; | |
| 33 | + color: #f6be1b; | |
| 34 | +} | |
| 35 | +.flex-basis-auto { | |
| 36 | + flex-basis: auto; | |
| 37 | +} | |
| 38 | +.l-region--bg-our-business { | |
| 39 | + background: #F4F4F4 url('/images/default-source/brand/about-us-16-9/skyline-green.png') center/cover no-repeat; | |
| 40 | +}</style><style type="text/css" media="all">@media screen and (min-width: 768px) { | |
| 41 | + /*.nav__primary { | |
| 42 | + display: none; | |
| 43 | + } | |
| 44 | + .nav__primary--rmn { | |
| 45 | + display: block; | |
| 46 | + }*/ | |
| 47 | +} | |
| 48 | +@media screen and (max-width: 767px) { | |
| 49 | +} | |
| 50 | +.col-content-block-h-100 > .content-block, | |
| 51 | +.col-content-block-h-100 > .content-block > div { | |
| 52 | + height: 100%; | |
| 53 | +} | |
| 54 | + | |
| 55 | +.col-content-block-h-100-flex > .content-block > div { | |
| 56 | + display: -webkit-box; | |
| 57 | + display: -ms-flexbox; | |
| 58 | + display: flex; | |
| 59 | + -webkit-box-orient: vertical; | |
| 60 | + -webkit-box-direction: normal; | |
| 61 | + -ms-flex-direction: column; | |
| 62 | + flex-direction: column; | |
| 63 | +} | |
| 64 | +.card-video--alt .card-video__play { | |
| 65 | + margin-left: auto; | |
| 66 | +} | |
| 67 | +.l-region--soft-gray-keyline { | |
| 68 | + border-top: solid 2px $F6BE1B; | |
| 69 | + background-color: #f4f4f4; | |
| 70 | +} | |
| 71 | + | |
| 72 | +.l-region--soft-gray-whiteline { | |
| 73 | + border-top: solid 2px #fff; | |
| 74 | + background-color: #f4f4f4; | |
| 75 | +} | |
| 76 | +.card-video--alt.card-video--alt-no-caption > a { | |
| 77 | + -webkit-box-orient: horizontal; | |
| 78 | +-webkit-box-direction: normal; | |
| 79 | + -ms-flex-direction: row; | |
| 80 | + flex-direction: row; | |
| 81 | + -ms-flex-wrap: wrap; | |
| 82 | + flex-wrap: wrap; | |
| 83 | +} | |
| 84 | +.card-video--alt.card-video--alt-no-caption .card-video__thumbnail { | |
| 85 | + margin-bottom: 0; | |
| 86 | +} | |
| 87 | +.card-video--alt.card-video--alt-no-caption .card-video__ctrl { | |
| 88 | + width: auto; | |
| 89 | + margin-top: auto; | |
| 90 | + margin-left: auto; | |
| 91 | +} | |
| 92 | + | |
| 93 | +@media screen and (min-width: 768px) { | |
| 94 | + .form-horizontal .control-label { | |
| 95 | + text-align: left; | |
| 96 | + } | |
| 97 | +} | |
| 98 | + | |
| 99 | +@media screen and (max-width: 767px) { | |
| 100 | + .card-video--alt.card-video--alt-no-caption .card-video__thumbnail { | |
| 101 | + width: 80% !important; | |
| 102 | + margin-bottom: 0; | |
| 103 | + } | |
| 104 | + .card-video--alt.card-video--alt-no-caption .card-video__play { | |
| 105 | + margin-left: 0; | |
| 106 | + } | |
| 107 | +} | |
| 108 | + | |
| 109 | +.o-button > button[type="submit"], | |
| 110 | +.o-button > .btn-primary:active, | |
| 111 | +.o-button > .btn-primary:active:focus { | |
| 112 | + background-color: inherit; | |
| 113 | + text-transform: uppercase; | |
| 114 | + color: inherit; | |
| 115 | + border: none; | |
| 116 | + width: inherit; | |
| 117 | + height: inherit; | |
| 118 | +} | |
| 119 | + | |
| 120 | +.nav__quickie li+li { | |
| 121 | + border-top: 1px solid #d9d9d9; | |
| 122 | +} | |
| 123 | +.o-button--secondary { | |
| 124 | + background-color: transparent; | |
| 125 | +} | |
| 126 | +.o-button--secondary:hover { | |
| 127 | + color: #F6BE1B; | |
| 128 | +} | |
| 129 | + | |
| 130 | +.css-select { | |
| 131 | + border-radius: 3px; | |
| 132 | + -moz-appearance: none; | |
| 133 | + -webkit-appearance: none; | |
| 134 | + appearance: none; | |
| 135 | + background-color: #fff; | |
| 136 | +background-image: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjkyLjQgMjkyLjQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDI5Mi40IDI5Mi40OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4uc3Qwe2ZpbGw6IzU1NTU1NTt9PC9zdHlsZT48cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjg3LDY5LjRjLTMuNC0zLjUtOC4xLTUuNS0xMy01LjRIMTguNGMtNSwwLTkuMywxLjgtMTIuOSw1LjRDMiw3Mi43LDAsNzcuNCwwLDgyLjJjMCw1LDEuOCw5LjMsNS40LDEyLjlsMTI4LDEyNy45YzMuNiwzLjYsNy44LDUuNCwxMi44LDUuNHM5LjItMS44LDEyLjgtNS40TDI4Nyw5NWMzLjUtMy41LDUuNC03LjgsNS40LTEyLjhzLTEuOS05LjItNS41LTEyLjhMMjg3LDY5LjR6Ii8+PC9zdmc+'); | |
| 137 | + background-repeat: no-repeat, repeat; | |
| 138 | + /* arrow icon position (1em from the right, 50% vertical) , then gradient position*/ | |
| 139 | + background-position: right .7em top 50%, 0 0; | |
| 140 | + /* icon size, then gradient */ | |
| 141 | + background-size: .65em auto, 100%; | |
| 142 | +} | |
| 143 | + | |
| 144 | +/* IE 11 rules */ | |
| 145 | +@media all and (-ms-high-contrast:none) { | |
| 146 | + *::-ms-backdrop, .img-responsive { | |
| 147 | + width: 100%; | |
| 148 | + } | |
| 149 | + *::-ms-backdrop, .o-button > button[type="submit"], | |
| 150 | + *::-ms-backdrop, .o-button > .btn-primary:active, | |
| 151 | + *::-ms-backdrop, .o-button > .btn-primary:active:focus { | |
| 152 | + background-color: #f6be1b; | |
| 153 | + } | |
| 154 | + *::-ms-backdrop, .card-video--alt .card-video__thumbnail { | |
| 155 | + height: 100%; | |
| 156 | + } | |
| 157 | +} | |
| 158 | + | |
| 159 | +.l-region--white { | |
| 160 | + background: #ffffff; | |
| 161 | +} | |
| 162 | + | |
| 163 | +h1.o-text-h1+h2.o-text-h2 { | |
| 164 | + line-height: 1.5em; | |
| 165 | +} | |
| 166 | + | |
| 167 | +.l-region--soft-green-keyline { | |
| 168 | + background-color: rgba(239, 245, 241); | |
| 169 | +} | |
| 170 | + | |
| 171 | +.media-left { | |
| 172 | + padding-right: 20px; | |
| 173 | +}</style><meta name="Generator" content="Sitefinity 15.4.8630.0 DX" /><link rel="canonical" href="https://www.firstnational.ca/residential/mortgage-rates" /><meta name="description" content="First National’s rates for qualified residential mortgages." /></head> <body> <!-- Google Tag Manager (noscript) --> <noscript> <iframe sandbox src="https://www.googletagmanager.com/ns.html?id=GTM-NKTBZWG" | |
| 174 | + height="0" width="0" style="display:none;visibility:hidden"></iframe> </noscript> <!-- End Google Tag Manager (noscript) --> <script src="/ScriptResource.axd?d=6DQe8ARl7A9TiuWej5ttCvuAePl8522bEkBxB9yeiRF0EdTrCZ9vqHPu4WE4TE1hTN6WeE1DyQO1UMqES1b4oOOvWqFN7H1eDCCsy3yrDilFJcaUvQrYvnG2k0iBlxiRg2kX-fUR_52TH7S1-8vf3l8Y7nJFZEE_uXcskpF0HqJzDomH0&t=ffffffff8869f732" type="text/javascript"></script><script src="/ScriptResource.axd?d=74FHISOx3fOPKwLxL0RMYg9_zSeppcSSreCteN8HMxjAEmkb6bfrZPeqVUHco7qzLH31T0uhAiCLkjihq9Xw989fay3HHhXZNmY8pzaX4VZL9dQBGsB9tlVAznc3dzwCC2DO8g2qGLODP30q1sNR4skfLnqRcdqkVDWpY79fqU88W1H00&t=ffffffff8869f732" type="text/javascript"></script> <div class="region__page"> <div class="l-region-notification"> <div class="container"> | |
| 175 | + | |
| 176 | + | |
| 177 | + </div> </div> <header class="l-region-header"> | |
| 178 | +<div id="Header_T240A2D21018_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row" data-sf-element="Row"> | |
| 179 | + <div id="Header_T240A2D21019_Col00" class="sf_colsIn col-sm-4 col-xs-6" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 180 | +<div class="content-block" > | |
| 181 | + <div ><a href="/home"><img src="/images/default-source/brand/global/first-national-logo-color1655feae-7538-4ce4-ada0-a924d05951b2.svg?sfvrsn=a8ed488b_2" width="215" alt="First National Financial LP®" title="First National Financial LP®" sf-image-responsive="false" sf-size="8290" class="img-responsive" /></a></div> | |
| 182 | +</div> | |
| 183 | + | |
| 184 | + </div> | |
| 185 | + <div id="Header_T240A2D21019_Col01" class="sf_colsIn col-sm-8 col-xs-6" data-sf-element="Column 2" data-placeholder-label="Column 2"><div id="Header_T240A2D21037_Col00" class="sf_colsIn nav-utility justify-end" data-sf-element="Region" data-placeholder-label="Region"> | |
| 186 | +<div class="nav-lang"> | |
| 187 | + <ul class="sf-lang-selector list-inline"> | |
| 188 | + <li> | |
| 189 | + <a href="#" onclick="openLink('fr'); return false;" class=""> | |
| 190 | + <span class="xs-hide sm-hide md-block">français</span> | |
| 191 | + <span class="md-hide" title="français">fr</span> | |
| 192 | + </a> | |
| 193 | + </li> | |
| 194 | + </ul> | |
| 195 | +</div> | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | +<ul class="list-unstyled nav-utility__item xs-hide"> | |
| 205 | + | |
| 206 | + <li class=""><a href="/contact-us" target="_self">Contact us</a></li> | |
| 207 | +</ul> | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | +<div class="nav-utility__item"> | |
| 216 | +<button aria-expanded="false" aria-haspopup="true" class="btn-link" data-target="#dropdown_search" data-toggle="dropdown" id="toggleSearch" type="button"> | |
| 217 | + <span class="sr-only">Toggle search</span> | |
| 218 | + <svg width="19" height="19" viewBox="0 0 19 19" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> | |
| 219 | +<path d="M17.71 16.29L14.31 12.9C15.407 11.5025 16.0022 9.77666 16 8C16 6.41775 15.5308 4.87103 14.6518 3.55544C13.7727 2.23985 12.5233 1.21447 11.0615 0.608967C9.59966 0.00346625 7.99113 -0.15496 6.43928 0.153721C4.88743 0.462403 3.46197 1.22433 2.34315 2.34315C1.22433 3.46197 0.462403 4.88743 0.153721 6.43928C-0.15496 7.99113 0.00346625 9.59966 0.608967 11.0615C1.21447 12.5233 2.23985 13.7727 3.55544 14.6518C4.87103 15.5308 6.41775 16 8 16C9.77666 16.0022 11.5025 15.407 12.9 14.31L16.29 17.71C16.383 17.8037 16.4936 17.8781 16.6154 17.9289C16.7373 17.9797 16.868 18.0058 17 18.0058C17.132 18.0058 17.2627 17.9797 17.3846 17.9289C17.5064 17.8781 17.617 17.8037 17.71 17.71C17.8037 17.617 17.8781 17.5064 17.9289 17.3846C17.9797 17.2627 18.0058 17.132 18.0058 17C18.0058 16.868 17.9797 16.7373 17.9289 16.6154C17.8781 16.4936 17.8037 16.383 17.71 16.29ZM2 8C2 6.81332 2.3519 5.65328 3.01119 4.66658C3.67047 3.67989 4.60755 2.91085 5.7039 2.45673C6.80026 2.0026 8.00666 1.88378 9.17055 2.11529C10.3344 2.3468 11.4035 2.91825 12.2426 3.75736C13.0818 4.59648 13.6532 5.66558 13.8847 6.82946C14.1162 7.99335 13.9974 9.19975 13.5433 10.2961C13.0892 11.3925 12.3201 12.3295 11.3334 12.9888C10.3467 13.6481 9.18669 14 8 14C6.4087 14 4.88258 13.3679 3.75736 12.2426C2.63214 11.1174 2 9.5913 2 8Z" fill="#7D7D7D" /> | |
| 220 | +</svg> | |
| 221 | + </button> | |
| 222 | +</div> | |
| 223 | +<div class="region__search" id="dropdown_search"> | |
| 224 | +<form action="/residential/mortgage-rates/search" method="POST" name="GoogleSearchController"> <label class="sr-only" for="s">Enter search terms</label> | |
| 225 | + <input class="form-control" id="s" name="s" type="search" placeholder="Enter search terms…" value="" /> | |
| 226 | + <input class="sr-only" type="submit" value="Search"> | |
| 227 | + <button class="btn btn-icon btn-link" type="button"> | |
| 228 | + X | |
| 229 | + </button> | |
| 230 | +</form></div> | |
| 231 | + | |
| 232 | +<div class="nav-utility__item nav-utility__item--nohr xs-order-1"> | |
| 233 | + <button | |
| 234 | + aria-expanded="false" | |
| 235 | + aria-haspopup="true" | |
| 236 | + data-target="#dropdown_login" | |
| 237 | + data-toggle="dropdown" | |
| 238 | + id="toggleLogin" | |
| 239 | + class="nav-utility__login" | |
| 240 | + type="button" | |
| 241 | + > | |
| 242 | + Login | |
| 243 | + </button> | |
| 244 | + | |
| 245 | + <div class="dropdown-login" id="dropdown_login"> | |
| 246 | + <a | |
| 247 | + href="https://mymortgage.firstnational.ca/?LanguageCode=en-CA" | |
| 248 | + target="_blank" | |
| 249 | + rel="noopener noreferrer"> | |
| 250 | + <img src="https://www.firstnational.ca/images/default-source/brand/global/home-yellow.svg?sfvrsn=da59728b_2" alt=""/> | |
| 251 | + <span class="color-primary o-text-h6" style="display: block;">My Mortgage Login</span><span class="o-text-bodysmall" style="display: block; margin-top: 5px;">For residential mortgage holders</span></a | |
| 252 | + > | |
| 253 | + | |
| 254 | + <a | |
| 255 | + href="https://merlinonline.firstnational.ca/Account/LogOn?ReturnUrl=%2flogon.aspx%3fLanguageCode%3den-CA&LanguageCode=en-CA" | |
| 256 | + target="_blank" | |
| 257 | + rel="noopener noreferrer"> | |
| 258 | + <img width="34" src="https://www.firstnational.ca/images/default-source/brand/global/merlin.png?sfvrsn=e659728b_2" alt=""/> | |
| 259 | + <span class="color-primary o-text-h6" style="display: block">MERLIN Login</span><span class="o-text-bodysmall" style="display: block; margin-top: 5px;">For residential mortgage brokers</span></a | |
| 260 | + > | |
| 261 | + </div> | |
| 262 | +</div> | |
| 263 | + | |
| 264 | +<div class="nav-utility__item nav-utility__item--nohr xs-block sm-hide"> | |
| 265 | + <button aria-expanded="false" aria-haspopup="true" class="nav-utility__mobile-menu" data-target="#Header_T240A2D21021_Col00" data-toggle="dropdown" id="togglePrimaryNav" type="button"> | |
| 266 | + <span class="sr-only">Toggle navigation</span> | |
| 267 | + <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"> | |
| 268 | + <path d="M0 0h24v24H0z" fill="none" /> | |
| 269 | + <path d="M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z" /> | |
| 270 | + </svg> | |
| 271 | + <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px"> | |
| 272 | + <path d="M0 0h24v24H0V0z" fill="none"/> | |
| 273 | + <path d="M3 18h13v-2H3v2zm0-5h10v-2H3v2zm0-7v2h13V6H3zm18 9.59L17.42 12 21 8.41 19.59 7l-5 5 5 5L21 15.59z"/> | |
| 274 | + </svg> | |
| 275 | + </button> | |
| 276 | +</div> | |
| 277 | +</div> | |
| 278 | + | |
| 279 | + </div> | |
| 280 | +</div> | |
| 281 | + | |
| 282 | +</div> | |
| 283 | +<div id="Header_T240A2D21020_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row" data-sf-element="Row"> | |
| 284 | + <div id="Header_T240A2D21021_Col00" class="sf_colsIn col-xs-12 c-wrapper-menu-primary" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 285 | + | |
| 286 | +<nav class="c-menu-primary spacing-40 xs-spacing-30" aria-label="Primary navigation"> | |
| 287 | + | |
| 288 | + | |
| 289 | + <ul class="c-menu-primary__list list-unstyled"> | |
| 290 | + <li class="c-menu-primary__item "> | |
| 291 | + <a class="c-menu-primary__link" href="/commercial"> | |
| 292 | + Commercial Mortgages | |
| 293 | + </a> | |
| 294 | + | |
| 295 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-0"> | |
| 296 | + <span class="sr-only">Toggle sub-menu for Commercial Mortgages</span> | |
| 297 | + </button> | |
| 298 | + | |
| 299 | + <div class="c-menu-primary__dropdown"> | |
| 300 | + <div class="container"> | |
| 301 | + <div class="row"> | |
| 302 | + <div class="col-xs-12"> | |
| 303 | + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-0"> | |
| 304 | + <li> | |
| 305 | + <a href="/commercial/first-national-difference" target="_self" aria-label=""> | |
| 306 | + First National difference | |
| 307 | + </a> | |
| 308 | + | |
| 309 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-0-0"> | |
| 310 | + <span class="sr-only">Toggle sub-menu for First National difference</span> | |
| 311 | + </button> | |
| 312 | + | |
| 313 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-0-0"> | |
| 314 | + <li class=""> | |
| 315 | + <a href="/commercial/first-national-difference/working-with-us" target="_self" aria-label=""> | |
| 316 | + Working with us | |
| 317 | + </a> | |
| 318 | + </li> | |
| 319 | + | |
| 320 | + </ul> | |
| 321 | + </li> | |
| 322 | + <li class=""> | |
| 323 | + <a href="/commercial/our-team" target="_self" aria-label="Commercial mortgages: Our team"> | |
| 324 | + Our team | |
| 325 | + </a> | |
| 326 | + </li> | |
| 327 | + <li> | |
| 328 | + <a href="/commercial/resources-insights" target="_self" aria-label=""> | |
| 329 | + Resources and insights | |
| 330 | + </a> | |
| 331 | + | |
| 332 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-2-0"> | |
| 333 | + <span class="sr-only">Toggle sub-menu for Resources and insights</span> | |
| 334 | + </button> | |
| 335 | + | |
| 336 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-2-0"> | |
| 337 | + <li class=""> | |
| 338 | + <a href="/commercial/resources-insights/capital-markets-update" target="_self" aria-label=""> | |
| 339 | + Capital Markets update | |
| 340 | + </a> | |
| 341 | + </li> | |
| 342 | + <li class=""> | |
| 343 | + <a href="/commercial/resources-insights/economic-insights" target="_self" aria-label=""> | |
| 344 | + Economic insights | |
| 345 | + </a> | |
| 346 | + </li> | |
| 347 | + <li class=""> | |
| 348 | + <a href="/commercial/resources-insights/expert-perspectives" target="_self" aria-label=""> | |
| 349 | + Expert perspectives | |
| 350 | + </a> | |
| 351 | + </li> | |
| 352 | + <li class=""> | |
| 353 | + <a href="/commercial/resources-insights/project-spotlight" target="_self" aria-label=""> | |
| 354 | + Project spotlight | |
| 355 | + </a> | |
| 356 | + </li> | |
| 357 | + | |
| 358 | + </ul> | |
| 359 | + </li> | |
| 360 | + <li> | |
| 361 | + <a href="/commercial/mortgage-solutions" target="_self" aria-label=""> | |
| 362 | + Mortgage solutions | |
| 363 | + </a> | |
| 364 | + | |
| 365 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-3-0"> | |
| 366 | + <span class="sr-only">Toggle sub-menu for Mortgage solutions</span> | |
| 367 | + </button> | |
| 368 | + | |
| 369 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-3-0"> | |
| 370 | + <li class=""> | |
| 371 | + <a href="/commercial/mortgage-solutions/retail" target="_self" aria-label=""> | |
| 372 | + Retail | |
| 373 | + </a> | |
| 374 | + </li> | |
| 375 | + <li class=""> | |
| 376 | + <a href="/commercial/mortgage-solutions/multi-family" target="_self" aria-label=""> | |
| 377 | + Multi-family residential | |
| 378 | + </a> | |
| 379 | + </li> | |
| 380 | + <li class=""> | |
| 381 | + <a href="/commercial/mortgage-solutions/office" target="_self" aria-label=""> | |
| 382 | + Office | |
| 383 | + </a> | |
| 384 | + </li> | |
| 385 | + <li class=""> | |
| 386 | + <a href="/commercial/mortgage-solutions/industrial" target="_self" aria-label=""> | |
| 387 | + Industrial | |
| 388 | + </a> | |
| 389 | + </li> | |
| 390 | + <li class=""> | |
| 391 | + <a href="/commercial/mortgage-solutions/storage" target="_self" aria-label=""> | |
| 392 | + Storage | |
| 393 | + </a> | |
| 394 | + </li> | |
| 395 | + <li class=""> | |
| 396 | + <a href="/commercial/mortgage-solutions/student-housing" target="_self" aria-label=""> | |
| 397 | + Student housing | |
| 398 | + </a> | |
| 399 | + </li> | |
| 400 | + <li class=""> | |
| 401 | + <a href="/commercial/mortgage-solutions/mixed-use" target="_self" aria-label=""> | |
| 402 | + Mixed-use | |
| 403 | + </a> | |
| 404 | + </li> | |
| 405 | + <li class=""> | |
| 406 | + <a href="/commercial/mortgage-solutions/land" target="_self" aria-label=""> | |
| 407 | + Land | |
| 408 | + </a> | |
| 409 | + </li> | |
| 410 | + | |
| 411 | + </ul> | |
| 412 | + </li> | |
| 413 | + <li> | |
| 414 | + <a href="/commercial/commercial-asset-management" target="_self" aria-label=""> | |
| 415 | + Commercial Asset Management | |
| 416 | + </a> | |
| 417 | + | |
| 418 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-4-0"> | |
| 419 | + <span class="sr-only">Toggle sub-menu for Commercial Asset Management</span> | |
| 420 | + </button> | |
| 421 | + | |
| 422 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-4-0"> | |
| 423 | + <li class=""> | |
| 424 | + <a href="/commercial/commercial-asset-management/financial-requirements" target="_self" aria-label=""> | |
| 425 | + Financial requirements | |
| 426 | + </a> | |
| 427 | + </li> | |
| 428 | + <li class=""> | |
| 429 | + <a href="/commercial/commercial-asset-management/undertaking" target="_self" aria-label=""> | |
| 430 | + Undertaking | |
| 431 | + </a> | |
| 432 | + </li> | |
| 433 | + <li class=""> | |
| 434 | + <a href="/commercial/commercial-asset-management/insurance-requirements" target="_self" aria-label=""> | |
| 435 | + Insurance requirements | |
| 436 | + </a> | |
| 437 | + </li> | |
| 438 | + <li class=""> | |
| 439 | + <a href="/commercial/commercial-asset-management/property-tax" target="_self" aria-label=""> | |
| 440 | + Property tax | |
| 441 | + </a> | |
| 442 | + </li> | |
| 443 | + <li class=""> | |
| 444 | + <a href="/commercial/commercial-asset-management/mortgage-information" target="_self" aria-label=""> | |
| 445 | + Mortgage information | |
| 446 | + </a> | |
| 447 | + </li> | |
| 448 | + <li class=""> | |
| 449 | + <a href="/commercial/commercial-asset-management/annual-compliance-forms" target="_self" aria-label=""> | |
| 450 | + Annual Compliance Forms | |
| 451 | + </a> | |
| 452 | + </li> | |
| 453 | + <li class=""> | |
| 454 | + <a href="/commercial/commercial-asset-management/rental-rate-increase" target="_self" aria-label=""> | |
| 455 | + Rental Rate Increase | |
| 456 | + </a> | |
| 457 | + </li> | |
| 458 | + | |
| 459 | + </ul> | |
| 460 | + </li> | |
| 461 | + <li class=""> | |
| 462 | + <a href="/commercial/bond-yields" target="_self" aria-label=""> | |
| 463 | + Bond yields | |
| 464 | + </a> | |
| 465 | + </li> | |
| 466 | + <li class=""> | |
| 467 | + <a href="/commercial/recent-financings" target="_self" aria-label=""> | |
| 468 | + Recent Financings | |
| 469 | + </a> | |
| 470 | + </li> | |
| 471 | + | |
| 472 | + </ul> | |
| 473 | + </div> | |
| 474 | + </div> | |
| 475 | + </div> | |
| 476 | + </div> | |
| 477 | + | |
| 478 | + </li> | |
| 479 | + <li class="c-menu-primary__item active"> | |
| 480 | + <a class="c-menu-primary__link" href="/residential"> | |
| 481 | + Residential Mortgages | |
| 482 | + </a> | |
| 483 | + | |
| 484 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-1"> | |
| 485 | + <span class="sr-only">Toggle sub-menu for Residential Mortgages</span> | |
| 486 | + </button> | |
| 487 | + | |
| 488 | + <div class="c-menu-primary__dropdown"> | |
| 489 | + <div class="container"> | |
| 490 | + <div class="row"> | |
| 491 | + <div class="col-xs-12"> | |
| 492 | + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-1"> | |
| 493 | + <li> | |
| 494 | + <a href="/residential/about" target="_self" aria-label=""> | |
| 495 | + About Us | |
| 496 | + </a> | |
| 497 | + | |
| 498 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-0-1"> | |
| 499 | + <span class="sr-only">Toggle sub-menu for About Us</span> | |
| 500 | + </button> | |
| 501 | + | |
| 502 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-0-1"> | |
| 503 | + <li class=""> | |
| 504 | + <a href="/residential/about/first-national-difference" target="_self" aria-label=""> | |
| 505 | + First National difference | |
| 506 | + </a> | |
| 507 | + </li> | |
| 508 | + <li class=""> | |
| 509 | + <a href="/residential/about/working-with-a-mortgage-broker" target="_self" aria-label=""> | |
| 510 | + Working with a mortgage broker | |
| 511 | + </a> | |
| 512 | + </li> | |
| 513 | + | |
| 514 | + </ul> | |
| 515 | + </li> | |
| 516 | + <li> | |
| 517 | + <a href="/residential/for-home-buyers" target="_self" aria-label=""> | |
| 518 | + For home buyers | |
| 519 | + </a> | |
| 520 | + | |
| 521 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-1-1"> | |
| 522 | + <span class="sr-only">Toggle sub-menu for For home buyers</span> | |
| 523 | + </button> | |
| 524 | + | |
| 525 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-1-1"> | |
| 526 | + <li class=""> | |
| 527 | + <a href="/residential/for-home-buyers/buying-your-first-home" target="_self" aria-label=""> | |
| 528 | + Buying your first home | |
| 529 | + </a> | |
| 530 | + </li> | |
| 531 | + <li class=""> | |
| 532 | + <a href="/residential/for-home-buyers/buying-your-next-home" target="_self" aria-label=""> | |
| 533 | + Buying your next home | |
| 534 | + </a> | |
| 535 | + </li> | |
| 536 | + <li class=""> | |
| 537 | + <a href="/residential/for-home-buyers/moving-your-mortgage-to-first-national" target="_self" aria-label=""> | |
| 538 | + Moving your mortgage to First National | |
| 539 | + </a> | |
| 540 | + </li> | |
| 541 | + | |
| 542 | + </ul> | |
| 543 | + </li> | |
| 544 | + <li> | |
| 545 | + <a href="/residential/for-customers" target="_self" aria-label=""> | |
| 546 | + For customers | |
| 547 | + </a> | |
| 548 | + | |
| 549 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-2-1"> | |
| 550 | + <span class="sr-only">Toggle sub-menu for For customers</span> | |
| 551 | + </button> | |
| 552 | + | |
| 553 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-2-1"> | |
| 554 | + <li class=""> | |
| 555 | + <a href="/residential/for-customers/new-to-first-national" target="_self" aria-label=""> | |
| 556 | + New to First National | |
| 557 | + </a> | |
| 558 | + </li> | |
| 559 | + <li class=""> | |
| 560 | + <a href="/residential/for-customers/managing-your-mortgage" target="_self" aria-label=""> | |
| 561 | + Managing Your Mortgage | |
| 562 | + </a> | |
| 563 | + </li> | |
| 564 | + <li class=""> | |
| 565 | + <a href="/residential/for-customers/renewing-your-mortgage" target="_self" aria-label=""> | |
| 566 | + Renewing your mortgage | |
| 567 | + </a> | |
| 568 | + </li> | |
| 569 | + <li class=""> | |
| 570 | + <a href="/residential/for-customers/refinancing-your-mortgage" target="_self" aria-label=""> | |
| 571 | + Refinancing your mortgage | |
| 572 | + </a> | |
| 573 | + </li> | |
| 574 | + <li class=""> | |
| 575 | + <a href="/residential/for-customers/mortgage-videos" target="_self" aria-label=""> | |
| 576 | + Mortgage videos | |
| 577 | + </a> | |
| 578 | + </li> | |
| 579 | + | |
| 580 | + </ul> | |
| 581 | + </li> | |
| 582 | + <li class=""> | |
| 583 | + <a href="/residential/my-mortgage" target="_self" aria-label=""> | |
| 584 | + My Mortgage® by First National | |
| 585 | + </a> | |
| 586 | + </li> | |
| 587 | + <li> | |
| 588 | + <a href="/residential/mortgage-calculators" target="_self" aria-label=""> | |
| 589 | + Mortgage calculators | |
| 590 | + </a> | |
| 591 | + | |
| 592 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-4-1"> | |
| 593 | + <span class="sr-only">Toggle sub-menu for Mortgage calculators</span> | |
| 594 | + </button> | |
| 595 | + | |
| 596 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-4-1"> | |
| 597 | + <li class=""> | |
| 598 | + <a href="/residential/mortgage-calculators/how-much-can-i-afford" target="_self" aria-label=""> | |
| 599 | + How much can I afford? | |
| 600 | + </a> | |
| 601 | + </li> | |
| 602 | + <li class=""> | |
| 603 | + <a href="/residential/mortgage-calculators/mortgage-payment-calculator" target="_self" aria-label=""> | |
| 604 | + Mortgage payment calculator | |
| 605 | + </a> | |
| 606 | + </li> | |
| 607 | + <li class=""> | |
| 608 | + <a href="/residential/mortgage-calculators/prepayment-calculator" target="_self" aria-label=""> | |
| 609 | + Prepayment calculator | |
| 610 | + </a> | |
| 611 | + </li> | |
| 612 | + <li class=""> | |
| 613 | + <a href="/residential/mortgage-calculators/calculate-prepayment-charges" target="_self" aria-label=""> | |
| 614 | + Calculate prepayment charges | |
| 615 | + </a> | |
| 616 | + </li> | |
| 617 | + | |
| 618 | + </ul> | |
| 619 | + </li> | |
| 620 | + <li> | |
| 621 | + <a href="/residential/mortgage-rates" target="_self" aria-label="Residential Mortgages: Mortgage rates"> | |
| 622 | + Mortgage rates | |
| 623 | + </a> | |
| 624 | + | |
| 625 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-5-1"> | |
| 626 | + <span class="sr-only">Toggle sub-menu for Mortgage rates</span> | |
| 627 | + </button> | |
| 628 | + | |
| 629 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-5-1"> | |
| 630 | + <li class=""> | |
| 631 | + <a href="/residential/mortgage-rates/prime-rates" target="_self" aria-label="Residential Mortgages: Prime rates"> | |
| 632 | + Prime rates | |
| 633 | + </a> | |
| 634 | + </li> | |
| 635 | + <li class=""> | |
| 636 | + <a href="/residential/mortgage-rates/excalibur-rates" target="_self" aria-label="Residential Mortgages: Excalibur rates"> | |
| 637 | + Excalibur rates | |
| 638 | + </a> | |
| 639 | + </li> | |
| 640 | + | |
| 641 | + </ul> | |
| 642 | + </li> | |
| 643 | + <li> | |
| 644 | + <a href="/residential/mortgage-resources" target="_self" aria-label=""> | |
| 645 | + Mortgage resources | |
| 646 | + </a> | |
| 647 | + | |
| 648 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-6-1"> | |
| 649 | + <span class="sr-only">Toggle sub-menu for Mortgage resources</span> | |
| 650 | + </button> | |
| 651 | + | |
| 652 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-6-1"> | |
| 653 | + <li class=""> | |
| 654 | + <a href="/residential/mortgage-resources/fraud-prevention" target="_self" aria-label=""> | |
| 655 | + Fraud prevention | |
| 656 | + </a> | |
| 657 | + </li> | |
| 658 | + <li class=""> | |
| 659 | + <a href="/residential/mortgage-resources/glossary-of-terms" target="_self" aria-label=""> | |
| 660 | + Glossary of terms | |
| 661 | + </a> | |
| 662 | + </li> | |
| 663 | + | |
| 664 | + </ul> | |
| 665 | + </li> | |
| 666 | + <li> | |
| 667 | + <a href="/residential/home-warranty-and-mortgage-insurance" target="_self" aria-label=""> | |
| 668 | + Home Warranty and Mortgage Insurance | |
| 669 | + </a> | |
| 670 | + | |
| 671 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-7-1"> | |
| 672 | + <span class="sr-only">Toggle sub-menu for Home Warranty and Mortgage Insurance</span> | |
| 673 | + </button> | |
| 674 | + | |
| 675 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-7-1"> | |
| 676 | + <li class=""> | |
| 677 | + <a href="/residential/home-warranty-and-mortgage-insurance/echelon--home-system-warranty-program" target="_self" aria-label=""> | |
| 678 | + Echelon- Home System Warranty Program | |
| 679 | + </a> | |
| 680 | + </li> | |
| 681 | + <li class=""> | |
| 682 | + <a href="/residential/home-warranty-and-mortgage-insurance/credit-security-plan---mortgage-life-and-disability-insurance" target="_self" aria-label=""> | |
| 683 | + Credit Security Plan - Mortgage Life and Disability Insurance | |
| 684 | + </a> | |
| 685 | + </li> | |
| 686 | + | |
| 687 | + </ul> | |
| 688 | + </li> | |
| 689 | + <li class=""> | |
| 690 | + <a href="/residential/solicitor-documents" target="_self" aria-label=""> | |
| 691 | + Solicitor Documents | |
| 692 | + </a> | |
| 693 | + </li> | |
| 694 | + <li class=""> | |
| 695 | + <a href="/residential/home-equity-secured-mastercard" target="_self" aria-label=""> | |
| 696 | + Home Equity Secured Mastercard | |
| 697 | + </a> | |
| 698 | + </li> | |
| 699 | + | |
| 700 | + </ul> | |
| 701 | + </div> | |
| 702 | + </div> | |
| 703 | + </div> | |
| 704 | + </div> | |
| 705 | + | |
| 706 | + </li> | |
| 707 | + <li class="c-menu-primary__item "> | |
| 708 | + <a class="c-menu-primary__link" href="/mortgage-brokers"> | |
| 709 | + Mortgage Brokers | |
| 710 | + </a> | |
| 711 | + | |
| 712 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-2"> | |
| 713 | + <span class="sr-only">Toggle sub-menu for Mortgage Brokers</span> | |
| 714 | + </button> | |
| 715 | + | |
| 716 | + <div class="c-menu-primary__dropdown"> | |
| 717 | + <div class="container"> | |
| 718 | + <div class="row"> | |
| 719 | + <div class="col-xs-12"> | |
| 720 | + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-2"> | |
| 721 | + <li class=""> | |
| 722 | + <a href="/mortgage-brokers/first-national-difference" target="_self" aria-label=""> | |
| 723 | + First National difference | |
| 724 | + </a> | |
| 725 | + </li> | |
| 726 | + <li class=""> | |
| 727 | + <a href="/mortgage-brokers/our-team" target="_self" aria-label="Mortgage brokers: Our team"> | |
| 728 | + Our team | |
| 729 | + </a> | |
| 730 | + </li> | |
| 731 | + <li> | |
| 732 | + <a href="/mortgage-brokers/mortgage-solutions" target="_self" aria-label=""> | |
| 733 | + Mortgage solutions | |
| 734 | + </a> | |
| 735 | + | |
| 736 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-2-2"> | |
| 737 | + <span class="sr-only">Toggle sub-menu for Mortgage solutions</span> | |
| 738 | + </button> | |
| 739 | + | |
| 740 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-2-2"> | |
| 741 | + <li class=""> | |
| 742 | + <a href="/mortgage-brokers/mortgage-solutions/transferring-a-mortgage" target="_self" aria-label=""> | |
| 743 | + Transferring a mortgage | |
| 744 | + </a> | |
| 745 | + </li> | |
| 746 | + <li class=""> | |
| 747 | + <a href="/mortgage-brokers/mortgage-solutions/home-improvements" target="_self" aria-label=""> | |
| 748 | + Home improvements | |
| 749 | + </a> | |
| 750 | + </li> | |
| 751 | + <li class=""> | |
| 752 | + <a href="/mortgage-brokers/mortgage-solutions/self-employed-and-contract-home-buyers" target="_self" aria-label=""> | |
| 753 | + Self-employed and contract home buyers | |
| 754 | + </a> | |
| 755 | + </li> | |
| 756 | + <li class=""> | |
| 757 | + <a href="/mortgage-brokers/mortgage-solutions/buying-a-rental-or-investment-property" target="_self" aria-label=""> | |
| 758 | + Buying a rental or investment property | |
| 759 | + </a> | |
| 760 | + </li> | |
| 761 | + <li class=""> | |
| 762 | + <a href="/mortgage-brokers/mortgage-solutions/home-warranty-and-mortgage-life-insurance" target="_self" aria-label=""> | |
| 763 | + Home Warranty and Mortgage Life Insurance | |
| 764 | + </a> | |
| 765 | + </li> | |
| 766 | + <li class=""> | |
| 767 | + <a href="/mortgage-brokers/mortgage-solutions/accessing-alternative-mortgage-options-(excalibur)" target="_self" aria-label=""> | |
| 768 | + Accessing alternative mortgage options (Excalibur) | |
| 769 | + </a> | |
| 770 | + </li> | |
| 771 | + | |
| 772 | + </ul> | |
| 773 | + </li> | |
| 774 | + <li> | |
| 775 | + <a href="/mortgage-brokers/broker-registration" target="_self" aria-label=""> | |
| 776 | + Broker registration | |
| 777 | + </a> | |
| 778 | + | |
| 779 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-3-2"> | |
| 780 | + <span class="sr-only">Toggle sub-menu for Broker registration</span> | |
| 781 | + </button> | |
| 782 | + | |
| 783 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-3-2"> | |
| 784 | + <li class=""> | |
| 785 | + <a href="/mortgage-brokers/broker-registration/agent-registration" target="_blank" aria-label=""> | |
| 786 | + Agent registration | |
| 787 | + </a> | |
| 788 | + </li> | |
| 789 | + | |
| 790 | + </ul> | |
| 791 | + </li> | |
| 792 | + <li> | |
| 793 | + <a href="/mortgage-brokers/resources-for-mortgage-brokers" target="_self" aria-label=""> | |
| 794 | + Resources for Mortgage Brokers | |
| 795 | + </a> | |
| 796 | + | |
| 797 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-4-2"> | |
| 798 | + <span class="sr-only">Toggle sub-menu for Resources for Mortgage Brokers</span> | |
| 799 | + </button> | |
| 800 | + | |
| 801 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-4-2"> | |
| 802 | + <li class=""> | |
| 803 | + <a href="/mortgage-brokers/resources-for-mortgage-brokers/be-the-expert" target="_self" aria-label=""> | |
| 804 | + Be the expert | |
| 805 | + </a> | |
| 806 | + </li> | |
| 807 | + <li class=""> | |
| 808 | + <a href="/mortgage-brokers/resources-for-mortgage-brokers/own-the-moment" target="_self" aria-label=""> | |
| 809 | + Own the moment | |
| 810 | + </a> | |
| 811 | + </li> | |
| 812 | + <li class=""> | |
| 813 | + <a href="/mortgage-brokers/resources-for-mortgage-brokers/assist-your-clients" target="_self" aria-label=""> | |
| 814 | + Assist your clients | |
| 815 | + </a> | |
| 816 | + </li> | |
| 817 | + | |
| 818 | + </ul> | |
| 819 | + </li> | |
| 820 | + <li> | |
| 821 | + <a href="/mortgage-brokers/mortgage-rates" target="_self" aria-label="Mortgage Brokers: Mortgage rates"> | |
| 822 | + Mortgage rates | |
| 823 | + </a> | |
| 824 | + | |
| 825 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-5-2"> | |
| 826 | + <span class="sr-only">Toggle sub-menu for Mortgage rates</span> | |
| 827 | + </button> | |
| 828 | + | |
| 829 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-5-2"> | |
| 830 | + <li class=""> | |
| 831 | + <a href="/mortgage-brokers/mortgage-rates/prime-rates" target="_self" aria-label="Mortgage Brokers: Prime rates"> | |
| 832 | + Prime rates | |
| 833 | + </a> | |
| 834 | + </li> | |
| 835 | + <li class=""> | |
| 836 | + <a href="/mortgage-brokers/mortgage-rates/excalibur-rates" target="_self" aria-label="Mortgage Brokers: Excalibur rates"> | |
| 837 | + Excalibur rates | |
| 838 | + </a> | |
| 839 | + </li> | |
| 840 | + | |
| 841 | + </ul> | |
| 842 | + </li> | |
| 843 | + <li class=""> | |
| 844 | + <a href="/mortgage-brokers/merlin-login" target="_self" aria-label=""> | |
| 845 | + MERLIN® | |
| 846 | + </a> | |
| 847 | + </li> | |
| 848 | + <li class=""> | |
| 849 | + <a href="/mortgage-brokers/appraisal-firm-onboarding-application" target="_self" aria-label=""> | |
| 850 | + Appraisal Firm Onboarding Application | |
| 851 | + </a> | |
| 852 | + </li> | |
| 853 | + | |
| 854 | + </ul> | |
| 855 | + </div> | |
| 856 | + </div> | |
| 857 | + </div> | |
| 858 | + </div> | |
| 859 | + | |
| 860 | + </li> | |
| 861 | + <li class="c-menu-primary__item "> | |
| 862 | + <a class="c-menu-primary__link" href="/investor-relations"> | |
| 863 | + Investors | |
| 864 | + </a> | |
| 865 | + | |
| 866 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-3"> | |
| 867 | + <span class="sr-only">Toggle sub-menu for Investors</span> | |
| 868 | + </button> | |
| 869 | + | |
| 870 | + <div class="c-menu-primary__dropdown"> | |
| 871 | + <div class="container"> | |
| 872 | + <div class="row"> | |
| 873 | + <div class="col-xs-12"> | |
| 874 | + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-3"> | |
| 875 | + <li class=""> | |
| 876 | + <a href="/investor-relations/news-releases" target="_self" aria-label=""> | |
| 877 | + News Releases | |
| 878 | + </a> | |
| 879 | + </li> | |
| 880 | + <li class=""> | |
| 881 | + <a href="/investor-relations/financial-reports-filings" target="_self" aria-label=""> | |
| 882 | + Financial reports & filings | |
| 883 | + </a> | |
| 884 | + </li> | |
| 885 | + <li class=""> | |
| 886 | + <a href="/investor-relations/shareholder-information-dividends" target="_self" aria-label=""> | |
| 887 | + Information for Corporate Bondholders | |
| 888 | + </a> | |
| 889 | + </li> | |
| 890 | + <li> | |
| 891 | + <a href="/investor-relations/corporate-governance" target="_self" aria-label=""> | |
| 892 | + Corporate Governance | |
| 893 | + </a> | |
| 894 | + | |
| 895 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-3-3"> | |
| 896 | + <span class="sr-only">Toggle sub-menu for Corporate Governance</span> | |
| 897 | + </button> | |
| 898 | + | |
| 899 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-3-3"> | |
| 900 | + <li class=""> | |
| 901 | + <a href="/investor-relations/corporate-governance/board-of-directors" target="_self" aria-label=""> | |
| 902 | + Board of Directors | |
| 903 | + </a> | |
| 904 | + </li> | |
| 905 | + <li class=""> | |
| 906 | + <a href="/investor-relations/corporate-governance/committees-and-policies" target="_self" aria-label=""> | |
| 907 | + Committees and policies | |
| 908 | + </a> | |
| 909 | + </li> | |
| 910 | + <li class=""> | |
| 911 | + <a href="/investor-relations/corporate-governance/board-and-committee-mandates" target="_self" aria-label=""> | |
| 912 | + Board and Committee Mandates | |
| 913 | + </a> | |
| 914 | + </li> | |
| 915 | + | |
| 916 | + </ul> | |
| 917 | + </li> | |
| 918 | + | |
| 919 | + </ul> | |
| 920 | + </div> | |
| 921 | + </div> | |
| 922 | + </div> | |
| 923 | + </div> | |
| 924 | + | |
| 925 | + </li> | |
| 926 | + <li class="c-menu-primary__item "> | |
| 927 | + <a class="c-menu-primary__link" href="/about/careers"> | |
| 928 | + Careers | |
| 929 | + </a> | |
| 930 | + | |
| 931 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-4"> | |
| 932 | + <span class="sr-only">Toggle sub-menu for Careers</span> | |
| 933 | + </button> | |
| 934 | + | |
| 935 | + <div class="c-menu-primary__dropdown"> | |
| 936 | + <div class="container"> | |
| 937 | + <div class="row"> | |
| 938 | + <div class="col-xs-12"> | |
| 939 | + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-4"> | |
| 940 | + <li class=""> | |
| 941 | + <a href="/about/careers/current-opportunities" target="_self" aria-label=""> | |
| 942 | + Current opportunities | |
| 943 | + </a> | |
| 944 | + </li> | |
| 945 | + <li class=""> | |
| 946 | + <a href="/about/careers/life-at-first-national" target="_self" aria-label=""> | |
| 947 | + Life at First National | |
| 948 | + </a> | |
| 949 | + </li> | |
| 950 | + <li class=""> | |
| 951 | + <a href="/about/careers/compensation-and-benefits" target="_self" aria-label=""> | |
| 952 | + Compensation and benefits | |
| 953 | + </a> | |
| 954 | + </li> | |
| 955 | + <li class=""> | |
| 956 | + <a href="/about/careers/community-and-social-initiatives" target="_self" aria-label=""> | |
| 957 | + Community and social initiatives | |
| 958 | + </a> | |
| 959 | + </li> | |
| 960 | + <li class=""> | |
| 961 | + <a href="/about/careers/starting-your-career" target="_self" aria-label=""> | |
| 962 | + Starting your career | |
| 963 | + </a> | |
| 964 | + </li> | |
| 965 | + <li class=""> | |
| 966 | + <a href="/about/careers/get-to-know-our-leaders" target="_self" aria-label=""> | |
| 967 | + Get to know our senior leaders | |
| 968 | + </a> | |
| 969 | + </li> | |
| 970 | + <li class=""> | |
| 971 | + <a href="/about/careers/stories" target="_self" aria-label=""> | |
| 972 | + Stories | |
| 973 | + </a> | |
| 974 | + </li> | |
| 975 | + | |
| 976 | + </ul> | |
| 977 | + </div> | |
| 978 | + </div> | |
| 979 | + </div> | |
| 980 | + </div> | |
| 981 | + | |
| 982 | + </li> | |
| 983 | + <li class="c-menu-primary__item "> | |
| 984 | + <a class="c-menu-primary__link" href="/about"> | |
| 985 | + About | |
| 986 | + </a> | |
| 987 | + | |
| 988 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-5"> | |
| 989 | + <span class="sr-only">Toggle sub-menu for About</span> | |
| 990 | + </button> | |
| 991 | + | |
| 992 | + <div class="c-menu-primary__dropdown"> | |
| 993 | + <div class="container"> | |
| 994 | + <div class="row"> | |
| 995 | + <div class="col-xs-12"> | |
| 996 | + <ul class="c-menu-primary__subnav list-unstyled" id="menu-primary-5"> | |
| 997 | + <li class=""> | |
| 998 | + <a href="/about/who-we-are" target="_self" aria-label=""> | |
| 999 | + Who we are | |
| 1000 | + </a> | |
| 1001 | + </li> | |
| 1002 | + <li> | |
| 1003 | + <a href="/about/leadership" target="_self" aria-label=""> | |
| 1004 | + Executive Leadership | |
| 1005 | + </a> | |
| 1006 | + | |
| 1007 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-1-5"> | |
| 1008 | + <span class="sr-only">Toggle sub-menu for Executive Leadership</span> | |
| 1009 | + </button> | |
| 1010 | + | |
| 1011 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-1-5"> | |
| 1012 | + <li class=""> | |
| 1013 | + <a href="/about/leadership/moray-tawse" target="_self" aria-label=""> | |
| 1014 | + Moray Tawse | |
| 1015 | + </a> | |
| 1016 | + </li> | |
| 1017 | + <li class=""> | |
| 1018 | + <a href="/about/leadership/jason-ellis" target="_self" aria-label=""> | |
| 1019 | + Jason Ellis | |
| 1020 | + </a> | |
| 1021 | + </li> | |
| 1022 | + <li class=""> | |
| 1023 | + <a href="/about/leadership/robert-inglis" target="_self" aria-label=""> | |
| 1024 | + Robert Inglis | |
| 1025 | + </a> | |
| 1026 | + </li> | |
| 1027 | + <li class=""> | |
| 1028 | + <a href="/about/leadership/thomas-kim" target="_self" aria-label=""> | |
| 1029 | + Thomas Kim | |
| 1030 | + </a> | |
| 1031 | + </li> | |
| 1032 | + <li class=""> | |
| 1033 | + <a href="/about/leadership/scott-c-mckenzie" target="_self" aria-label=""> | |
| 1034 | + Scott C. McKenzie | |
| 1035 | + </a> | |
| 1036 | + </li> | |
| 1037 | + <li class=""> | |
| 1038 | + <a href="/about/leadership/jeremy-wedgbury" target="_self" aria-label=""> | |
| 1039 | + Jeremy Wedgbury | |
| 1040 | + </a> | |
| 1041 | + </li> | |
| 1042 | + <li class=""> | |
| 1043 | + <a href="/about/leadership/hilda-wong" target="_self" aria-label=""> | |
| 1044 | + Hilda Wong | |
| 1045 | + </a> | |
| 1046 | + </li> | |
| 1047 | + | |
| 1048 | + </ul> | |
| 1049 | + </li> | |
| 1050 | + <li class=""> | |
| 1051 | + <a href="/about/our-business" target="_self" aria-label=""> | |
| 1052 | + Our business | |
| 1053 | + </a> | |
| 1054 | + </li> | |
| 1055 | + <li class=""> | |
| 1056 | + <a href="/about/outsourced-mortgage-servicing-solutions" target="_self" aria-label=""> | |
| 1057 | + Outsourced Mortgage Servicing Solutions | |
| 1058 | + </a> | |
| 1059 | + </li> | |
| 1060 | + <li> | |
| 1061 | + <a href="/about/corporate-governance" target="_self" aria-label=""> | |
| 1062 | + Corporate Governance | |
| 1063 | + </a> | |
| 1064 | + | |
| 1065 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-4-5"> | |
| 1066 | + <span class="sr-only">Toggle sub-menu for Corporate Governance</span> | |
| 1067 | + </button> | |
| 1068 | + | |
| 1069 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-4-5"> | |
| 1070 | + <li class=""> | |
| 1071 | + <a href="/about/corporate-governance/board-of-directors" target="_self" aria-label=""> | |
| 1072 | + Board of Directors | |
| 1073 | + </a> | |
| 1074 | + </li> | |
| 1075 | + <li class=""> | |
| 1076 | + <a href="/about/corporate-governance/committees-of-the-board" target="_self" aria-label=""> | |
| 1077 | + Committees of the Board | |
| 1078 | + </a> | |
| 1079 | + </li> | |
| 1080 | + | |
| 1081 | + </ul> | |
| 1082 | + </li> | |
| 1083 | + <li> | |
| 1084 | + <a href="/about/media-centre" target="_self" aria-label=""> | |
| 1085 | + Media centre | |
| 1086 | + </a> | |
| 1087 | + | |
| 1088 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-5-5"> | |
| 1089 | + <span class="sr-only">Toggle sub-menu for Media centre</span> | |
| 1090 | + </button> | |
| 1091 | + | |
| 1092 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-5-5"> | |
| 1093 | + <li class=""> | |
| 1094 | + <a href="/about/media-centre/press-releases" target="_self" aria-label=""> | |
| 1095 | + Press releases | |
| 1096 | + </a> | |
| 1097 | + </li> | |
| 1098 | + <li class=""> | |
| 1099 | + <a href="/about/media-centre/media-toolkit" target="_self" aria-label=""> | |
| 1100 | + Media toolkit | |
| 1101 | + </a> | |
| 1102 | + </li> | |
| 1103 | + <li class=""> | |
| 1104 | + <a href="/about/media-centre/media-contacts" target="_self" aria-label=""> | |
| 1105 | + Media contacts | |
| 1106 | + </a> | |
| 1107 | + </li> | |
| 1108 | + | |
| 1109 | + </ul> | |
| 1110 | + </li> | |
| 1111 | + <li> | |
| 1112 | + <a href="/about/policies-disclaimers" target="_self" aria-label=""> | |
| 1113 | + Policies and Disclaimers | |
| 1114 | + </a> | |
| 1115 | + | |
| 1116 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-6-5"> | |
| 1117 | + <span class="sr-only">Toggle sub-menu for Policies and Disclaimers</span> | |
| 1118 | + </button> | |
| 1119 | + | |
| 1120 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-6-5"> | |
| 1121 | + <li class=""> | |
| 1122 | + <a href="/about/policies-disclaimers/privacy-policy" target="_self" aria-label=""> | |
| 1123 | + Privacy Policy | |
| 1124 | + </a> | |
| 1125 | + </li> | |
| 1126 | + <li class=""> | |
| 1127 | + <a href="/about/policies-disclaimers/whistleblower-policy" target="_self" aria-label=""> | |
| 1128 | + Whistleblower Policy | |
| 1129 | + </a> | |
| 1130 | + </li> | |
| 1131 | + <li class=""> | |
| 1132 | + <a href="/about/policies-disclaimers/aoda" target="_self" aria-label=""> | |
| 1133 | + Accessibility for Ontarians with Disabilities Act | |
| 1134 | + </a> | |
| 1135 | + </li> | |
| 1136 | + <li class=""> | |
| 1137 | + <a href="/about/policies-disclaimers/disclaimers" target="_self" aria-label=""> | |
| 1138 | + Disclaimers | |
| 1139 | + </a> | |
| 1140 | + </li> | |
| 1141 | + <li class=""> | |
| 1142 | + <a href="/about/policies-disclaimers/code-of-business-ethics" target="_self" aria-label=""> | |
| 1143 | + Code of Business Ethics | |
| 1144 | + </a> | |
| 1145 | + </li> | |
| 1146 | + | |
| 1147 | + </ul> | |
| 1148 | + </li> | |
| 1149 | + <li> | |
| 1150 | + <a href="/about/careers" target="_self" aria-label=""> | |
| 1151 | + Careers | |
| 1152 | + </a> | |
| 1153 | + | |
| 1154 | + <button class="c-menu-primary__toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" type="button" data-target="#menu-primary-sub-7-5"> | |
| 1155 | + <span class="sr-only">Toggle sub-menu for Careers</span> | |
| 1156 | + </button> | |
| 1157 | + | |
| 1158 | + <ul class="c-menu-primary__subnav c-menu-primary__subnav--children list-unstyled" id="menu-primary-sub-7-5"> | |
| 1159 | + <li class=""> | |
| 1160 | + <a href="/about/careers/current-opportunities" target="_self" aria-label=""> | |
| 1161 | + Current opportunities | |
| 1162 | + </a> | |
| 1163 | + </li> | |
| 1164 | + <li class=""> | |
| 1165 | + <a href="/about/careers/life-at-first-national" target="_self" aria-label=""> | |
| 1166 | + Life at First National | |
| 1167 | + </a> | |
| 1168 | + </li> | |
| 1169 | + <li class=""> | |
| 1170 | + <a href="/about/careers/compensation-and-benefits" target="_self" aria-label=""> | |
| 1171 | + Compensation and benefits | |
| 1172 | + </a> | |
| 1173 | + </li> | |
| 1174 | + <li class=""> | |
| 1175 | + <a href="/about/careers/community-and-social-initiatives" target="_self" aria-label=""> | |
| 1176 | + Community and social initiatives | |
| 1177 | + </a> | |
| 1178 | + </li> | |
| 1179 | + <li class=""> | |
| 1180 | + <a href="/about/careers/starting-your-career" target="_self" aria-label=""> | |
| 1181 | + Starting your career | |
| 1182 | + </a> | |
| 1183 | + </li> | |
| 1184 | + <li class=""> | |
| 1185 | + <a href="/about/careers/get-to-know-our-leaders" target="_self" aria-label=""> | |
| 1186 | + Get to know our senior leaders | |
| 1187 | + </a> | |
| 1188 | + </li> | |
| 1189 | + <li class=""> | |
| 1190 | + <a href="/about/careers/stories" target="_self" aria-label=""> | |
| 1191 | + Stories | |
| 1192 | + </a> | |
| 1193 | + </li> | |
| 1194 | + | |
| 1195 | + </ul> | |
| 1196 | + </li> | |
| 1197 | + | |
| 1198 | + </ul> | |
| 1199 | + </div> | |
| 1200 | + </div> | |
| 1201 | + </div> | |
| 1202 | + </div> | |
| 1203 | + | |
| 1204 | + </li> | |
| 1205 | + </ul> | |
| 1206 | +</nav> | |
| 1207 | + | |
| 1208 | + | |
| 1209 | + | |
| 1210 | + | |
| 1211 | + | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1222 | + | |
| 1223 | +<ul class="list-unstyled nav-utility justify-end spacing-20 sm-hide"> | |
| 1224 | + | |
| 1225 | + <li class=""><a href="/contact-us" target="_self">Contact us</a></li> | |
| 1226 | + <li class=""><a href="/about/careers" target="_self">Careers</a></li> | |
| 1227 | +</ul> | |
| 1228 | + | |
| 1229 | + | |
| 1230 | + | |
| 1231 | + | |
| 1232 | + | |
| 1233 | + | |
| 1234 | + <div> | |
| 1235 | + <ul class="sf-breadscrumb breadcrumb"> | |
| 1236 | + <li><a href="/residential">Residential Mortgages</a></li> | |
| 1237 | + <li class="active">Mortgage rates</li> | |
| 1238 | + </ul> | |
| 1239 | + </div> | |
| 1240 | + | |
| 1241 | + </div> | |
| 1242 | +</div> | |
| 1243 | + | |
| 1244 | +</div> | |
| 1245 | + </header> <main class="region__body"> | |
| 1246 | +<div id="Body_C001_Col00" class="sf_colsIn region__content l-region--soft-gray-gradient gutter-top md-padding-bottom-5 padding-bottom-2" data-sf-element="Region" data-placeholder-label="Region"><div id="Body_C002_Col00" class="sf_colsIn container container-hero" data-sf-element="Container" data-placeholder-label="Container"><div class="row align-center" data-sf-element="Row"> | |
| 1247 | + <div id="Body_C003_Col00" class="sf_colsIn col-xs-12 col-md-4 padding-bottom-2 md-padding-bottom-0" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 1248 | +<div class="content-block" > | |
| 1249 | + <div ><div class="media-figure" style="background:url('/images/default-source/residential/bg-mortgage-rates.jpg?sfvrsn=95c46b8b_2') center/cover no-repeat;"></div></div> | |
| 1250 | +</div> | |
| 1251 | + | |
| 1252 | + </div> | |
| 1253 | + <div id="Body_C003_Col01" class="sf_colsIn col-xs-12 col-md-7 col-md-offset-1" data-sf-element="Column 2" data-placeholder-label="Column 2"> | |
| 1254 | +<div class="content-block" > | |
| 1255 | + <div ><h1 class="o-text-h1">Mortgage Rates</h1><h2 class="o-text-h2">Our rates for qualified residential mortgages</h2><p class="o-text-lead color-gray">When you’re buying your dream home, what you pay for your mortgage is a key consideration. But there are other vital priorities as well. Making mortgage decisions based on rate alone doesn’t always deliver value in the long run. At First National, | |
| 1256 | + we want to help you secure a competitive mortgage and provide value along the way — simplified management, ongoing education, accessible expertise – so you can own your dream home and achieve your financial goals.</p></div> | |
| 1257 | +</div> | |
| 1258 | + | |
| 1259 | + </div> | |
| 1260 | +</div> | |
| 1261 | + | |
| 1262 | +</div> | |
| 1263 | +<div id="Body_C004_Col00" class="sf_colsIn container margin-top-3" data-sf-element="Container" data-placeholder-label="Container"><div id="Body_C030_Col00" class="sf_colsIn card card-white card-floating padding-1 md-padding-3" data-sf-element="Region" data-placeholder-label="Region"><div class="row align-top" data-sf-element="Row"> | |
| 1264 | + <div id="Body_C005_Col00" class="sf_colsIn col-xs-12 col-md-12 margin-bottom-2" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 1265 | + | |
| 1266 | + | |
| 1267 | +<div class="card card-white card-floating padding-1 md-padding-3"> | |
| 1268 | + <p>Rates effective as of <strong>Tuesday, August 18, 2026</strong> for qualified residential properties.</p> | |
| 1269 | + <h2 class="color-primary o-text-h1">Posted Rates</h2> | |
| 1270 | + <h3>Fixed rate mortgages – closed terms</h3> | |
| 1271 | + <div class="table-responsive margin-top-2"> | |
| 1272 | + <table class="table table-striped table-rwd"> | |
| 1273 | + <thead> | |
| 1274 | + <tr> | |
| 1275 | + <th><span class="sr-only">Mortgage type</span></th> | |
| 1276 | + <th> | |
| 1277 | + 1 year | |
| 1278 | + </th> | |
| 1279 | + <th> | |
| 1280 | + 2 year | |
| 1281 | + </th> | |
| 1282 | + <th> | |
| 1283 | + 3 year | |
| 1284 | + </th> | |
| 1285 | + <th> | |
| 1286 | + 4 year | |
| 1287 | + </th> | |
| 1288 | + <th> | |
| 1289 | + 5 year | |
| 1290 | + </th> | |
| 1291 | + <th> | |
| 1292 | + 7 year | |
| 1293 | + </th> | |
| 1294 | + <th> | |
| 1295 | + 10 year | |
| 1296 | + </th> | |
| 1297 | + </tr> | |
| 1298 | + </thead> | |
| 1299 | + <tbody> | |
| 1300 | + <tr> | |
| 1301 | + <th>Insured</th> | |
| 1302 | + <td aria-label="1 year">5.14</td> | |
| 1303 | + <td aria-label="2 year">4.74</td> | |
| 1304 | + <td aria-label="3 year">4.94</td> | |
| 1305 | + <td aria-label="4 year">4.89</td> | |
| 1306 | + <td aria-label="5 year">4.64</td> | |
| 1307 | + <td aria-label="7 year">5.14</td> | |
| 1308 | + <td aria-label="10 year">5.49</td> | |
| 1309 | + </tr> | |
| 1310 | + | |
| 1311 | + <tr> | |
| 1312 | + <th>Insurable up to 65% LTV</th> | |
| 1313 | + <td aria-label="1 year">5.14</td> | |
| 1314 | + <td aria-label="2 year">4.74</td> | |
| 1315 | + <td aria-label="3 year">4.94</td> | |
| 1316 | + <td aria-label="4 year">4.89</td> | |
| 1317 | + <td aria-label="5 year">4.69</td> | |
| 1318 | + <td aria-label="7 year">N/A</td> | |
| 1319 | + <td aria-label="10 year">N/A</td> | |
| 1320 | + </tr> | |
| 1321 | + | |
| 1322 | + <tr> | |
| 1323 | + <th>Insurable > 65% - 70% LTV</th> | |
| 1324 | + <td aria-label="1 year">5.14</td> | |
| 1325 | + <td aria-label="2 year">4.74</td> | |
| 1326 | + <td aria-label="3 year">4.94</td> | |
| 1327 | + <td aria-label="4 year">4.89</td> | |
| 1328 | + <td aria-label="5 year">4.79</td> | |
| 1329 | + <td aria-label="7 year">N/A</td> | |
| 1330 | + <td aria-label="10 year">N/A</td> | |
| 1331 | + </tr> | |
| 1332 | + | |
| 1333 | + <tr> | |
| 1334 | + <th>Insurable > 70% - 75% LTV</th> | |
| 1335 | + <td aria-label="1 year">5.14</td> | |
| 1336 | + <td aria-label="2 year">4.74</td> | |
| 1337 | + <td aria-label="3 year">4.94</td> | |
| 1338 | + <td aria-label="4 year">4.89</td> | |
| 1339 | + <td aria-label="5 year">4.89</td> | |
| 1340 | + <td aria-label="7 year">N/A</td> | |
| 1341 | + <td aria-label="10 year">N/A</td> | |
| 1342 | + </tr> | |
| 1343 | + | |
| 1344 | + <tr> | |
| 1345 | + <th>Insurable > 75% - 80% LTV</th> | |
| 1346 | + <td aria-label="1 year">5.14</td> | |
| 1347 | + <td aria-label="2 year">4.74</td> | |
| 1348 | + <td aria-label="3 year">4.94</td> | |
| 1349 | + <td aria-label="4 year">4.89</td> | |
| 1350 | + <td aria-label="5 year">4.94</td> | |
| 1351 | + <td aria-label="7 year">N/A</td> | |
| 1352 | + <td aria-label="10 year">N/A</td> | |
| 1353 | + </tr> | |
| 1354 | + | |
| 1355 | + | |
| 1356 | + <tr> | |
| 1357 | + <th>Conventional</th> | |
| 1358 | + <td aria-label="1 year">5.14</td> | |
| 1359 | + <td aria-label="2 year">4.74</td> | |
| 1360 | + <td aria-label="3 year">4.94</td> | |
| 1361 | + <td aria-label="4 year">4.89</td> | |
| 1362 | + <td aria-label="5 year">4.94</td> | |
| 1363 | + <td aria-label="7 year">5.14</td> | |
| 1364 | + <td aria-label="10 year">5.49</td> | |
| 1365 | + </tr> | |
| 1366 | + </tbody> | |
| 1367 | + </table> | |
| 1368 | + | |
| 1369 | + | |
| 1370 | + | |
| 1371 | + </div> | |
| 1372 | +</div> | |
| 1373 | + | |
| 1374 | +<div class="card card-white card-floating padding-1 md-padding-3 margin-top-3"> | |
| 1375 | + <h3>Adjustable rate mortgages</h3> | |
| 1376 | + <table class="table table-striped margin-top-2"> | |
| 1377 | + <thead> | |
| 1378 | + <tr> | |
| 1379 | + <th><span class="sr-only">Mortgage type</span></th> | |
| 1380 | + | |
| 1381 | + <th> | |
| 1382 | + 5 year | |
| 1383 | + </th> | |
| 1384 | + </tr> | |
| 1385 | + </thead> | |
| 1386 | + <tbody> | |
| 1387 | + <tr> | |
| 1388 | + <th style="width: 55%;">Insured</th> | |
| 1389 | + <td> | |
| 1390 | +Prime - 0.75% for the entire term </td> | |
| 1391 | + </tr> | |
| 1392 | + <tr> | |
| 1393 | + <th>Insurable up to 65% LTV</th> | |
| 1394 | + <td> | |
| 1395 | +Prime - 0.70% for the entire term </td> | |
| 1396 | + </tr> | |
| 1397 | + <tr> | |
| 1398 | + <th>Insurable > 65% - 70% LTV</th> | |
| 1399 | + <td> | |
| 1400 | +Prime - 0.50% for the entire term </td> | |
| 1401 | + </tr> | |
| 1402 | + <tr> | |
| 1403 | + <th>Insurable > 70% - 75% LTV</th> | |
| 1404 | + <td> | |
| 1405 | +Prime - 0.45% for the entire term </td> | |
| 1406 | + </tr> | |
| 1407 | + <tr> | |
| 1408 | + <th>Insurable > 75% - 80% LTV</th> | |
| 1409 | + <td> | |
| 1410 | +Prime - 0.40% for the entire term </td> | |
| 1411 | + </tr> | |
| 1412 | + <tr> | |
| 1413 | + <th>Conventional</th> | |
| 1414 | + <td> | |
| 1415 | +Prime - 0.16% for the entire term </td> | |
| 1416 | + </tr> | |
| 1417 | + | |
| 1418 | + </tbody> | |
| 1419 | + </table> | |
| 1420 | + | |
| 1421 | + <p class="gutter-bottom"> | |
| 1422 | + <strong> | |
| 1423 | + First National Prime Rate: | |
| 1424 | + <span> 4.45</span> | |
| 1425 | + </strong> | |
| 1426 | + </p> | |
| 1427 | +</div> | |
| 1428 | + | |
| 1429 | +<div class="card card-white card-floating padding-1 md-padding-3 margin-top-3"> | |
| 1430 | + <h3>Open term mortgage</h3> | |
| 1431 | + <table class="table table-striped margin-top-2"> | |
| 1432 | + <tbody> | |
| 1433 | + <tr> | |
| 1434 | + <th style="width: 55%;">6 month fixed term</th> | |
| 1435 | + <td><span>9.95</span></td> | |
| 1436 | + </tr> | |
| 1437 | + </tbody> | |
| 1438 | + </table> | |
| 1439 | +</div> | |
| 1440 | + | |
| 1441 | + | |
| 1442 | + </div> | |
| 1443 | +</div> | |
| 1444 | + | |
| 1445 | + | |
| 1446 | + | |
| 1447 | + | |
| 1448 | +<div class="card card-white card-floating padding-1 md-padding-3 margin-top-3" id="excalibur"> | |
| 1449 | + <h3>Excalibur Mortgage Rates</h3> | |
| 1450 | + <div class="table-responsive margin-top-2"> | |
| 1451 | + <table class="table table-striped table-rwd"> | |
| 1452 | + <thead> | |
| 1453 | + <tr> | |
| 1454 | + <th><span class="sr-only">Year</span></th> | |
| 1455 | + <th>680+</th> | |
| 1456 | + <th>650-679</th> | |
| 1457 | + <th>600-649</th> | |
| 1458 | + <th>580-599</th> | |
| 1459 | + <th>< 580</th> | |
| 1460 | + </tr> | |
| 1461 | + </thead> | |
| 1462 | + | |
| 1463 | + <tbody> | |
| 1464 | + <tr> | |
| 1465 | + <th>1 Year</th> | |
| 1466 | + <td aria-label="680+">4.99%</td> | |
| 1467 | + <td aria-label="650-679">5.14%</td> | |
| 1468 | + <td aria-label="600-649">5.39%</td> | |
| 1469 | + <td aria-label="580-599">5.64%</td> | |
| 1470 | + <td aria-label="< 580">5.89%</td> | |
| 1471 | + </tr> | |
| 1472 | + | |
| 1473 | + <tr> | |
| 1474 | + <th>2 Year</th> | |
| 1475 | + <td aria-label="680+">5.09%</td> | |
| 1476 | + <td aria-label="650-679">5.34%</td> | |
| 1477 | + <td aria-label="600-649">5.59%</td> | |
| 1478 | + <td aria-label="580-599">5.84%</td> | |
| 1479 | + <td aria-label="< 580">5.99%</td> | |
| 1480 | + </tr> | |
| 1481 | + | |
| 1482 | + <tr> | |
| 1483 | + <th>3 Year</th> | |
| 1484 | + <td aria-label="680+">5.14%</td> | |
| 1485 | + <td aria-label="650-679">5.39%</td> | |
| 1486 | + <td aria-label="600-649">5.64%</td> | |
| 1487 | + <td aria-label="580-599">5.89%</td> | |
| 1488 | + <td aria-label="< 580">6.14%</td> | |
| 1489 | + </tr> | |
| 1490 | + </tbody> | |
| 1491 | + </table> | |
| 1492 | + </div> | |
| 1493 | +</div> | |
| 1494 | +</div> | |
| 1495 | + | |
| 1496 | +</div> | |
| 1497 | +<div id="Body_C008_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row align-center" data-sf-element="Row"> | |
| 1498 | + <div id="Body_C009_Col00" class="sf_colsIn col-xs-12" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 1499 | +<div class="content-block" > | |
| 1500 | + <div ><div class="card padding-top-1 md-padding-top-3 padding-left-1 md-padding-left-3 padding-right-1 md-padding-right-3 padding-bottom-0 md-padding-bottom-0"><small class="o-text-tiny text-muted"><p>Not familiar with these mortgage terms? <a href="/residential/mortgage-resources/glossary-of-terms">Visit our glossary here.</a></p><p>Rates are for single-family residential mortgages.</p><p>Actual rates may vary. Please contact First National toll-free at 1.888.670.2111 or send us a message through your <a target="_blank" href="http://mymortgage.firstnational.ca">My Mortgage</a> account. </p><p>Rates are subject to change without notice.<br />E. & O. E.</p></small> | |
| 1501 | +</div></div> | |
| 1502 | +</div> | |
| 1503 | + | |
| 1504 | + </div> | |
| 1505 | +</div> | |
| 1506 | + | |
| 1507 | +</div> | |
| 1508 | + | |
| 1509 | +</div> | |
| 1510 | +<div id="Body_C010_Col00" class="sf_colsIn region__content l-region--default-keyline padding-top-2 padding-bottom-2 md-padding-top-4 md-padding-bottom-4" data-sf-element="Region" data-placeholder-label="Region"><div id="Body_C011_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row" data-sf-element="Row"> | |
| 1511 | + <div id="Body_C028_Col00" class="sf_colsIn col-content-block-h-100 col-content-block-h-100-flex col-xs-12 col-md-3 md-padding-top-1 md-padding-bottom-1 md-padding-right-2 md-display-flex md-direction-col" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 1512 | +<div class="content-block" > | |
| 1513 | + <div ><div class="display-flex align-center margin-bottom-2"><img alt="" aria-hidden="true" height="57" src="/ResourcePackages/FirstNationalBootstrap/assets/src/icons/calculator.svg" width="45" /><h3 class="o-text-strong color-black margin-top-0 margin-left-1" id="h-how-much">How much can I afford?<br /> </h3></div><p>Estimate your potential mortgage amount for a realistic picture of what you can afford when buying your dream home.</p><div class="nav__quickie nav__quickie--alt md-margin-top-auto"><ul class="list-unstyled"><li><small><a id="b-how-much" href="/residential/mortgage-calculators/how-much-can-i-afford" aria-labelledby="b-how-much h-how-much">Try the calculator</a></small></li></ul></div></div> | |
| 1514 | +</div> | |
| 1515 | + | |
| 1516 | + </div> | |
| 1517 | + <div id="Body_C028_Col01" class="sf_colsIn col-content-block-h-100 col-content-block-h-100-flex col-xs-12 col-md-3 position-relative md-divider divider-left padding-top-2 md-padding-top-1 md-padding-bottom-1 md-padding-left-2 md-padding-right-2 md-display-flex md-direction-col" data-sf-element="Column 2" data-placeholder-label="Column 2"> | |
| 1518 | +<div class="content-block" > | |
| 1519 | + <div ><div class="display-flex align-center margin-bottom-2"><img alt="" aria-hidden="true" height="57" src="/ResourcePackages/FirstNationalBootstrap/assets/src/icons/calculator.svg" width="45" /><h3 class="o-text-strong color-black margin-top-0 margin-left-1" id="h-mortgage-payment">Mortgage payment calculator</h3></div><p>Get a better idea of your monthly mortgage costs by estimating your potential payments.</p><div class="nav__quickie nav__quickie--alt md-margin-top-auto"><ul class="list-unstyled"><li><small><a id="b-mortgage-payment" href="/residential/mortgage-calculators/mortgage-payment-calculator" aria-labelledby="b-mortgage-payment h-mortgage-payment">CALCULATE YOUR PAYMENTS</a></small></li></ul></div></div> | |
| 1520 | +</div> | |
| 1521 | + | |
| 1522 | + </div> | |
| 1523 | + <div id="Body_C028_Col02" class="sf_colsIn col-content-block-h-100 col-content-block-h-100-flex col-xs-12 col-md-3 position-relative md-divider divider-left padding-top-2 md-padding-top-1 md-padding-bottom-1 md-padding-left-2 md-padding-right-2 md-display-flex md-direction-col" data-sf-element="Column 3" data-placeholder-label="Column 3"> | |
| 1524 | +<div class="content-block" > | |
| 1525 | + <div ><div class="display-flex align-center margin-bottom-2"><img alt="" aria-hidden="true" height="59" src="/ResourcePackages/FirstNationalBootstrap/assets/src/icons/television.svg" width="59" /><h3 class="o-text-strong color-black margin-top-0 margin-left-1" id="h-mortgage-videos">Mortgage videos<br /> </h3></div><p>Learn about key mortgage concepts in a simple and clear way so you can make decisions and manage your mortgage with confidence.</p><div class="nav__quickie nav__quickie--alt md-margin-top-auto"><ul class="list-unstyled"><li><small><a id="b-mortgage-videos" href="/residential/for-customers/mortgage-videos" aria-labelledby="b-mortgage-videos h-mortgage-videos">WATCH THE VIDEOS</a></small></li></ul></div></div> | |
| 1526 | +</div> | |
| 1527 | + | |
| 1528 | + </div> | |
| 1529 | + <div id="Body_C028_Col03" class="sf_colsIn col-content-block-h-100 col-content-block-h-100-flex col-xs-12 col-md-3 position-relative md-divider divider-left padding-top-2 md-padding-top-1 md-padding-bottom-1 md-padding-left-2 md-padding-right-2 md-display-flex md-direction-col" data-sf-element="Column 4" data-placeholder-label="Column 4"> | |
| 1530 | +<div class="content-block" > | |
| 1531 | + <div ><div class="display-flex align-center margin-bottom-2"><img alt="" aria-hidden="true" height="59" src="/ResourcePackages/FirstNationalBootstrap/assets/src/icons/support.svg" width="67" /><h3 class="o-text-strong color-black margin-top-0 margin-left-1" id="h-mortgage-broker">Working with a Mortgage Broker</h3></div><p>Take the stress out of the mortgage process by relying on a credible professional who can provide trusted advice about mortgage rates, options and advantages.</p><div class="nav__quickie nav__quickie--alt md-margin-top-auto"><ul class="list-unstyled"><li><small><a id="b-mortgage-broker" href="/residential/about/working-with-a-mortgage-broker" aria-labelledby="b-mortgage-broker h-mortgage-broker"><span class="sr-only">Working with a Mortgage Broker: </span>LEARN MORE</a></small></li></ul></div></div> | |
| 1532 | +</div> | |
| 1533 | + | |
| 1534 | + </div> | |
| 1535 | +</div> | |
| 1536 | + | |
| 1537 | +</div> | |
| 1538 | + | |
| 1539 | +</div> | |
| 1540 | + </main> <footer class="l-region-footer"> | |
| 1541 | +<div id="Footer_T240A2D21001_Col00" class="sf_colsIn container" data-sf-element="Container" data-placeholder-label="Container"><div class="row align-center xs-text-center" data-sf-element="Row"> | |
| 1542 | + <div id="Footer_T240A2D21002_Col00" class="sf_colsIn col-xs-12 col-md-5 col-sm-6" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 1543 | +<div class="content-block" > | |
| 1544 | + <div ><img src="/images/default-source/brand/global/first-national-logo-color1655feae-7538-4ce4-ada0-a924d05951b2.svg?sfvrsn=a8ed488b_2" width="215" title="first-national-logo-color" style="max-width:100%;height:auto;" sf-image-responsive="true" sf-size="8290" alt="" /></div> | |
| 1545 | +</div> | |
| 1546 | + | |
| 1547 | + </div> | |
| 1548 | + <div id="Footer_T240A2D21002_Col01" class="sf_colsIn col-xs-12 col-sm-6 col-md-offset-1 xs-spacing-30" data-sf-element="Column 2" data-placeholder-label="Column 2"> | |
| 1549 | +<div class="content-block" > | |
| 1550 | + <div ><div class="c-nav-social"><p id="hdrSocialLinks" class="c-nav-social__label o-text-h6 color-fn-green">Follow us:</p><ul class="c-nav-social__list list-unstyled" aria-labelledby="hdrSocialLinks"><li><a href="https://www.linkedin.com/company/first-national-financial-lp" target="_blank" rel="noopener noreferrer"><img src="/images/default-source/brand/global/linkedin.svg?sfvrsn=537a738b_4" alt="LinkedIn" /><span class="sr-only">(opens in new window)</span></a> | |
| 1551 | + </li><li><a href="https://www.youtube.com/channel/UCZt79dOBS8dGZAvWhd3uq0g" target="_blank" rel="noopener noreferrer"><img src="/images/default-source/brand/global/youtube.svg?sfvrsn=5c7a738b_6" alt="YouTube" /><span class="sr-only">(opens in new window)</span></a> | |
| 1552 | + </li></ul></div></div> | |
| 1553 | +</div> | |
| 1554 | + | |
| 1555 | + </div> | |
| 1556 | +</div> | |
| 1557 | +<div class="row spacing-60 align-center xs-text-center" data-sf-element="Row"> | |
| 1558 | + <div id="Footer_T240A2D21003_Col00" class="sf_colsIn col-xs-12 col-md-5 col-sm-6" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 1559 | +<div class="content-block" > | |
| 1560 | + <div ><p>First National is one of Canada's largest non-bank mortgage lenders, offering both commercial mortgages and residential mortgage solutions.</p></div> | |
| 1561 | +</div> | |
| 1562 | + | |
| 1563 | + </div> | |
| 1564 | + <div id="Footer_T240A2D21003_Col01" class="sf_colsIn col-xs-12 col-sm-6 col-md-offset-1 xs-spacing-30" data-sf-element="Column 2" data-placeholder-label="Column 2"> | |
| 1565 | +<div class="content-block" > | |
| 1566 | + <div ><div class="c-form-subscribe" id="formEmailAlerts"><p class="c-form-subscribe__legend o-text-h6 color-fn-green" id="hdrEmailAlerts" role="heading" aria-level="2">Keep up to date with email alerts</p><div class="c-form-subscribe__combo"><label class="sr-only" for="alert_email">Email address</label> | |
| 1567 | + <input class="c-form-subscribe__combo__input" id="alert_email" name="alert_email" placeholder="Enter your email address" type="email" value="" /><button class="c-form-subscribe__combo__submit" type="submit">Subscribe</button></div></div></div> | |
| 1568 | +</div> | |
| 1569 | + | |
| 1570 | + </div> | |
| 1571 | +</div> | |
| 1572 | +<div class="row align-center spacing-50" data-sf-element="Row"> | |
| 1573 | + <div id="Footer_T240A2D21040_Col00" class="sf_colsIn col-xs-12" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 1574 | + | |
| 1575 | + | |
| 1576 | + | |
| 1577 | + | |
| 1578 | +<ul class="list-unstyled nav-utility xs-justify-center"> | |
| 1579 | + | |
| 1580 | + <li class=""><a href="/about/policies-disclaimers/privacy-policy" target="_self">Privacy Policy</a></li> | |
| 1581 | + <li class=""><a href="/accessibility" target="_self">Accessibility</a></li> | |
| 1582 | + <li class=""><a href="/contact-us" target="_self">Contact us</a></li> | |
| 1583 | + <li class=""><a href="/about/policies-and-disclaimers/privacy-policy#cookies" target="_self">Cookies</a></li> | |
| 1584 | + <li class=""><a href="/residential/mortgage-resources/fraud-prevention" target="_self">Fraud prevention</a></li> | |
| 1585 | + <li class=""><a href="/licenses" target="_self">Licenses</a></li> | |
| 1586 | +</ul> | |
| 1587 | + | |
| 1588 | + | |
| 1589 | + | |
| 1590 | + | |
| 1591 | + | |
| 1592 | + | |
| 1593 | + | |
| 1594 | + </div> | |
| 1595 | +</div> | |
| 1596 | +<div class="row align-center spacing-20" data-sf-element="Row"> | |
| 1597 | + <div id="Footer_T240A2D21041_Col00" class="sf_colsIn col-xs-12" data-sf-element="Column 1" data-placeholder-label="Column 1"> | |
| 1598 | +<div class="content-block" > | |
| 1599 | + <div ><ul class="list-inline o-text-bodysmall xs-text-center"><li>FSRA License Nos. 10514 & 11252</li><li>© First National Financial LP</li></ul></div> | |
| 1600 | +</div> | |
| 1601 | + | |
| 1602 | + </div> | |
| 1603 | +</div> | |
| 1604 | + | |
| 1605 | +</div> | |
| 1606 | + | |
| 1607 | +<script> | |
| 1608 | + var cdJsHost = (("https:" == document.location.protocol) ? "https://" : "http://"); | |
| 1609 | + document.write(unescape("%3Cscript src='" + cdJsHost + "analytics.clickdimensions.com/ts.js' type='text/javascript'%3E%3C/script%3E")); | |
| 1610 | +</script> | |
| 1611 | + | |
| 1612 | +<script> | |
| 1613 | + var cdAnalytics = new clickdimensions.Analytics('analytics.clickdimensions.com'); | |
| 1614 | + cdAnalytics.setAccountKey('aChIusjvxA066jajDAVjFg'); | |
| 1615 | + cdAnalytics.setDomain('firstnational.ca'); | |
| 1616 | + cdAnalytics.trackPage(); | |
| 1617 | +</script> | |
| 1618 | + | |
| 1619 | +<div class="modal fade" id="modalExternalLinks" tabindex="-1" role="dialog" aria-labelledby="modalExternalLinksLabel"> | |
| 1620 | + <div class="modal-dialog" role="document"> | |
| 1621 | + <div class="container"> | |
| 1622 | + <div class="row"> | |
| 1623 | + <div class="col-sm-8 col-sm-offset-2 col-xs-12"> | |
| 1624 | + <div class="modal-content"> | |
| 1625 | + <div class="modal-header"> | |
| 1626 | + <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button> | |
| 1627 | + <h2 class="modal-title" id="modalExternalLinksLabel">You are now leaving the First National website</h2> | |
| 1628 | + </div> | |
| 1629 | + <div class="modal-body"> | |
| 1630 | + <p id="modalExtLinksContent"></p> | |
| 1631 | + </div> | |
| 1632 | + <div class="modal-footer"> | |
| 1633 | + <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> | |
| 1634 | + <a class="btn btn-primary" href="#" id="modalExternalLinksTarget" target="_blank">Ok</a> | |
| 1635 | + </div> | |
| 1636 | + </div> | |
| 1637 | + </div> | |
| 1638 | + </div> | |
| 1639 | + </div> | |
| 1640 | + </div> | |
| 1641 | +</div> | |
| 1642 | +<script> | |
| 1643 | +document.getElementById("modalExtLinksContent").innerHTML = "The website you will be entering is not owned or operated by First National or any of its affiliates or subsidiaries. The content, products and information contained on third party websites are not owned or controlled by First National and/or any of its subsidiaries. We make no representations about, do not endorse, and are not responsible or liable for damages relating to the third party, its products or services, its website, its privacy policies or practices, or the content of the third party website."; | |
| 1644 | +</script> | |
| 1645 | +<div class="content-block cookie-message" > | |
| 1646 | + <div ><div class="container"><div class="row"><div class="col-xs-12"><p>First National uses cookies to make sure you receive the best experience on our website and we collect anonymous information to improve the site’s functionality. By continuing on our site without changing your settings, you consent to First National’s use of <a href="/about/policies-disclaimers/privacy-policy#cookies">cookies</a>. To understand more, visit our <a href="/about/policies-disclaimers/privacy-policy">Privacy Policy</a>.</p><p><button class="cookie-close-button btn btn-default">Got it</button></p></div></div></div></div> | |
| 1647 | +</div> | |
| 1648 | + | |
| 1649 | + | |
| 1650 | + | |
| 1651 | + | |
| 1652 | + </footer> </div> <script src="/ResourcePackages/FirstNationalBootstrap/assets/dist/js/app.min.js?v=639227790309152293" type="text/javascript"></script><input data-sf-role='fr' type='hidden' value='https://www.firstnational.ca/fr/clients-résidentiels/taux-hypothécaires'><script type="text/javascript" src="/js/jquery.cookieBar.min.js"></script><script type="text/javascript"> | |
| 1653 | +$(document).ready(function() { $(".cookie-message").prependTo(".region__page"); $(".cookie-message").cookieBar({ closeButton: ".cookie-close-button" }); }); | |
| 1654 | +</script> <script>(function () { var v = 1787609799 * 3.1415926535898; v = Math.floor(v); document.cookie = "__zjc1546="+v+"; expires=Mon, 24 Aug 2026 22:17:39 UTC; path=/"; })()</script></body> </html> | |
added
tests/fixtures/mortgage/mcap.html
+1376 −0
@@ -0,0 +1,1376 @@ | ||
| 1 | + | |
| 2 | + | |
| 3 | +<!DOCTYPE html> | |
| 4 | +<html lang="en-CA"> | |
| 5 | + | |
| 6 | +<head> | |
| 7 | + | |
| 8 | + | |
| 9 | +<meta charset="UTF-8" /> | |
| 10 | +<meta name="viewport" content="width=device-width, initial-scale=1"> | |
| 11 | +<meta name="accept-language" content="en-CA" /> | |
| 12 | +<meta name="description" content="Competitive mortgage rates paired with mortgage features you’ll love — available from Canada’s largest independent Mortgage Finance Company. Learn more about MCAP!"> | |
| 13 | +<meta name="keywords" content="mortgage,rate,rates,mcap"> | |
| 14 | +<meta name="facebook-domain-verification" content="9nc0ncxgm6jjmi6532xkjsyru2l5mf" /> | |
| 15 | + | |
| 16 | + | |
| 17 | + <!--Twitter--> | |
| 18 | + <meta name="twitter:title" content="Mortgage Rates | MCAP"> | |
| 19 | + <meta name="twitter:description" content="Competitive mortgage rates paired with mortgage features you’ll love — available from Canada’s largest independent Mortgage Finance Company. Learn more about MCAP!"> | |
| 20 | + <meta name="twitter:image" content="https://www.mcap.com/Content/MCAP/UploadedImages/MCAP_Mortgage-Rates-canada_Social-Image-Preview.jpg"> | |
| 21 | + <!--OG-Facebook--> | |
| 22 | + <meta property="og:title" content="Mortgage Rates | MCAP"> | |
| 23 | + <meta property="og:image" content="https://www.mcap.com/Content/MCAP/UploadedImages/MCAP_Mortgage-Rates-canada_Social-Image-Preview.jpg"> | |
| 24 | + <meta property="og:description" content="Competitive mortgage rates paired with mortgage features you’ll love — available from Canada’s largest independent Mortgage Finance Company. Learn more about MCAP!"> | |
| 25 | + | |
| 26 | + | |
| 27 | + <title> | |
| 28 | + Mortgage Rates | MCAP | |
| 29 | + </title> | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + <link rel="alternate" href="https://www.mcap.com/residential-mortgages/advice/mortgage-rates-canada" hreflang="en-ca" /> | |
| 34 | + <link rel="alternate" href="https://www.mcap.com/fr/residentiel/conseils/taux-hypothecaires-canada" hreflang="fr-ca" /> | |
| 35 | + <link rel="preload" as="font" href="/Content/MCAP/Modern/assets/fonts/DINPro-Regular.woff" type="font/woff2" crossorigin="anonymous"> | |
| 36 | + <link rel="preload" as="font" href="/Content/MCAP/Modern/assets/fonts/DINPro-Medium.woff" type="font/woff2" crossorigin="anonymous"> | |
| 37 | + <link rel="preload" as="font" href="/Content/MCAP/Modern/assets/fonts/DIN-Bold.woff" type="font/woff2" crossorigin="anonymous"> | |
| 38 | + <link rel="preload" as="font" href="/Content/MCAP/Modern/assets/fonts/DINPro-Black.woff" type="font/woff2" crossorigin="anonymous"> | |
| 39 | + <script type="application/ld+json"> | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + { "@context": "http://schema.org", "@type": "MortgageLoan", "name": "Agency 30 Year Fixed", "description": "Experience easier budgeting with predictable monthly payments. Relax knowing you’ll never have to worry about rising interest rates for the life of your loan.", "amount": { "@type": "MonetaryAmount", "amount": "200000", "currency": "USD" }, "loanTerm": { "@type": "QuantitativeValue", "value": "30", "unitCode": "ANN" }, "interestRate": "3.625", "annualPercentageRate": "3.8047", "loanRepaymentForm": { "@type": "RepaymentSpecification", "loanPaymentAmount": { "@type": "MonetaryAmount", "amount": "909.3", "currency": "USD" }, "downPayment": "20", "numberOfLoanPayments": "360", "loanPaymentFrequency": "Monthly" } }{ "@context": "http://schema.org", "@type": "MortgageLoan", "name": "1-10 Year Closed - Fixed Rate Mortgage", "brand": "MCAP", "description": "With a fixed interest rate mortgage payments are guaranteed not to change for the entire length of the term selected.", "currency": "CAD", "offers": "Owner-occupied with a maximum of 4 units", "offers": "Small rental with MCAP’s Small Rental Program (5 year only)", "offers": "Secondary home (1 unit)","loanTerm": { "@type": "QuantitativeValue", "value": "1", "unitCode": "ANN" },"loanTerm": { "@type": "QuantitativeValue", "value": "2", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "3", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "4", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "5", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "7", "unitCode": "ANN" }, "loanTerm": { "@type": "QuantitativeValue", "value": "10", "unitCode": "ANN" }, "loanPaymentFrequency": "Monthly","loanPaymentFrequency": "Semi-monthly","loanPaymentFrequency": "Bi-weekly","loanPaymentFrequency": "Weekly (accelerated)","url": "https://www.mcap.com/residential-mortgages/customers/products/1-10-year-closed", }} | |
| 45 | + </script> | |
| 46 | + | |
| 47 | + <link rel="icon" href="/Content/MCAP/favicon.ico" /> | |
| 48 | + <link href="/Content/MCAP/Modern/css/mcap.min.css?v=2" rel="stylesheet" /> | |
| 49 | + <script type="text/javascript" defer="defer"> | |
| 50 | + var readMoreText = 'Read More' | |
| 51 | +var readLessText = 'Read Less' | |
| 52 | +var emailCorrection = 'Did you mean' | |
| 53 | +var unsupportedbrowser = 'This site does not fully support your web browser version. Please update your web browser for a better experience and enhanced security on this site. Visit your web browser to download the latest version.' | |
| 54 | + | |
| 55 | + </script> | |
| 56 | + | |
| 57 | + <script type="text/javascript" src="/Scripts/jquery-3.5.1.min.js"></script> | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + <style> | |
| 63 | + main .big-blue-bar{ | |
| 64 | +margin-top: 50px; | |
| 65 | +} | |
| 66 | + | |
| 67 | + | |
| 68 | +@media (min-width: 769px) { | |
| 69 | +main .article-list-row.mb-5 {margin-bottom: 90px !important;} | |
| 70 | +.charts1 {margin-top: -12px;} | |
| 71 | +} | |
| 72 | + </style> | |
| 73 | +</head> | |
| 74 | + | |
| 75 | +<body id="mcap-site" data-title="Mortgage Rates"> | |
| 76 | + <a class="skip-main" id="skip-main" href="#main">Skip to main content</a> | |
| 77 | + | |
| 78 | + | |
| 79 | +<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> | |
| 80 | + | |
| 81 | +<div class="container-fluid bg-accent-blue text-white banner-overlap"> | |
| 82 | + <div class="container"> | |
| 83 | + <p class="font-weight-300 mb-20"> | |
| 84 | + | |
| 85 | + </p> | |
| 86 | + <p class="font-weight-300 mb-0"> | |
| 87 | + <p margin-bottom: 10px;">Want to learn more about the impact of a prime rate change? <a href="https://www.mcap.com/residential-mortgages/advice/mortgage-rates-canada/impact-of-a-prime-rate-change" style="color:#ffffff; text-decoration:underline;">Click here</a> to find out more.</p> | |
| 88 | + | |
| 89 | +<!--<p><strong>Canada Post Labour Disruption</strong></p><p>Canada Post has announced that mail delivery will resume on a rotating basis. You may experience delivery delays as they work through the backlog. For instant access to your mortgage, log in to <a href="https://www.mcap.com/mymcap/login?lang=en" style="color:#ffffff; text-decoration: underline;">MyMCAP</a>. As always, our customer service team is available to help. <a href="https://www.mcap.com/contact-us/residential-mortgages" style="color:#ffffff; text-decoration: underline;">Contact us here</a>.</p>--> | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + </p> | |
| 99 | + </div> | |
| 100 | + <button class="close-btn" title="Close banner"></button> | |
| 101 | +</div> | |
| 102 | + | |
| 103 | + <!-- used for Language toggle to keep the same pages--> | |
| 104 | + <!-- Prepares language toggle for: engUrl and frURL temp data are intialized in contentController.cs, blogController.cs, and _index.cshtml--> | |
| 105 | + <!--setting logo URL--> | |
| 106 | + <!--if anything other than about-mcap, set it to the main BU otherwise set it to about-mcap--> | |
| 107 | + | |
| 108 | +<nav class="navbar navbar-expand-sm bg-primary-blue static-top" aria-label="top navigation" id="navbar-main"> | |
| 109 | + <div class="container"> | |
| 110 | + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarMCAP" aria-controls="navbarMCAP" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button> | |
| 111 | + <div class="collapse navbar-collapse" id="navbarMCAP"> | |
| 112 | + <ul class="navbar-nav mr-auto text-uppercase"> | |
| 113 | + <li class="nav-item active"> | |
| 114 | + <a class="nav-link" href="/residential-mortgages" aria-label="you are on RESIDENTIAL MORTGAGES "> | |
| 115 | + RESIDENTIAL MORTGAGES | |
| 116 | + | |
| 117 | + </a> | |
| 118 | + </li> | |
| 119 | + <li class="nav-item "> | |
| 120 | + <a class="nav-link" href="/commercial-mortgages" > | |
| 121 | + COMMERCIAL MORTGAGES | |
| 122 | + | |
| 123 | + </a> | |
| 124 | + </li> | |
| 125 | + <li class="nav-item "> | |
| 126 | + <a class="nav-link" href="/development-finance" > | |
| 127 | + DEVELOPMENT FINANCE | |
| 128 | + | |
| 129 | + </a> | |
| 130 | + </li> | |
| 131 | + </ul> | |
| 132 | + <ul class="navbar-nav ml-auto text-uppercase"> | |
| 133 | + <li class="nav-item "><a class="nav-link" href="/corporate/about-mcap">About MCAP</a></li> | |
| 134 | + | |
| 135 | + <li class="nav-item "><a class="nav-link" href="/corporate/careers">Careers</a></li> | |
| 136 | + | |
| 137 | + <li class="nav-item "><a class="nav-link" href="/contact-us/residential-mortgages" aria-label="Contact Us">Contact Us</a></li> | |
| 138 | + <li class="nav-item"><a class="nav-link" href="/fr/residentiel/conseils/taux-hypothecaires-canada">FR</a></li> | |
| 139 | + </ul> | |
| 140 | + </div> | |
| 141 | + </div> | |
| 142 | +</nav> | |
| 143 | + | |
| 144 | +<!-- Header--> | |
| 145 | +<header class="menu-container position-relative"> | |
| 146 | + <div class="container"> | |
| 147 | + <div class="logo"> | |
| 148 | + <a href="/residential-mortgages"> | |
| 149 | + <img src="/Content/MCAP/Modern/assets/images/logos/mcap.svg" alt="MCAP logo" /> | |
| 150 | + </a> | |
| 151 | + </div> | |
| 152 | + <nav aria-label="sub navigation"> | |
| 153 | + | |
| 154 | + <ul class="menu" role="menubar" id="mainNav"> | |
| 155 | + | |
| 156 | + <li class="menu-item active" role="none"> | |
| 157 | + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" aria-label="you are on ADVICE "><span>ADVICE</span></a> | |
| 158 | + | |
| 159 | + <div class="megamenu-content"> | |
| 160 | + <div class="container"> | |
| 161 | + <div class="row"> | |
| 162 | + <div class="offset-lg-2 col-lg-3 col-md-6"> | |
| 163 | + <ul role="menu"> | |
| 164 | + <li class="submenu-item" role="none"> | |
| 165 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/first-time-home-buyer"><span>Buying Your First Home</span></a> | |
| 166 | + </li> | |
| 167 | + <li class="submenu-item" role="none"> | |
| 168 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/existing-home-buyer"><span>Buying Your Next Home</span></a> | |
| 169 | + </li> | |
| 170 | + <li class="submenu-item" role="none"> | |
| 171 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/refinance"><span>Refinancing Your Mortgage</span></a> | |
| 172 | + </li> | |
| 173 | + <li class="submenu-item" role="none"> | |
| 174 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/secondary-property"><span>Buying a Second Property</span></a> | |
| 175 | + </li> | |
| 176 | + <li class="submenu-item" role="none"> | |
| 177 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/renewals"><span>Renewing Your Mortgage</span></a> | |
| 178 | + </li> | |
| 179 | + <li class="submenu-item" role="none"> | |
| 180 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/switch-to-mcap"><span>Switching to MCAP</span></a> | |
| 181 | + </li> | |
| 182 | + <li class="submenu-item" role="none"> | |
| 183 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/advice/mortgage-rates-canada"><span>Mortgage Rates</span></a> | |
| 184 | + </li> | |
| 185 | + </ul> | |
| 186 | + </div> | |
| 187 | + </div> | |
| 188 | + </div> | |
| 189 | + </div> | |
| 190 | + </li> | |
| 191 | + <li class="menu-item " role="none"> | |
| 192 | + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" ><span>PRODUCTS</span></a> | |
| 193 | + | |
| 194 | + <div class="megamenu-content"> | |
| 195 | + <div class="container"> | |
| 196 | + <div class="row"> | |
| 197 | + <div class="offset-lg-2 col-lg-3 col-md-6"> | |
| 198 | + <ul role="menu"> | |
| 199 | + <li class="submenu-item" role="none"> | |
| 200 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/products/our-mortgages"><span>MCAP Mortgages</span></a> | |
| 201 | + </li> | |
| 202 | + <li class="submenu-item" role="none"> | |
| 203 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/products/mortgage-life-and-disability-insurance"><span>Home Mortgage Protection: Mortgage Life & Disability Insurance</span></a> | |
| 204 | + </li> | |
| 205 | + <li class="submenu-item" role="none"> | |
| 206 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/products/home-service-plan"><span>Home Service Plan</span></a> | |
| 207 | + </li> | |
| 208 | + </ul> | |
| 209 | + </div> | |
| 210 | + </div> | |
| 211 | + </div> | |
| 212 | + </div> | |
| 213 | + </li> | |
| 214 | + <li class="menu-item " role="none"> | |
| 215 | + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" ><span>PROGRAMS</span></a> | |
| 216 | + | |
| 217 | + <div class="megamenu-content"> | |
| 218 | + <div class="container"> | |
| 219 | + <div class="row"> | |
| 220 | + <div class="offset-lg-2 col-lg-3 col-md-6"> | |
| 221 | + <ul role="menu"> | |
| 222 | + <li class="submenu-item" role="none"> | |
| 223 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/programs/property-tax-service"><span>Property Tax Service</span></a> | |
| 224 | + </li> | |
| 225 | + <li class="submenu-item" role="none"> | |
| 226 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/programs/register-for-key-to-hope"><span>Key to Hope™ - Supporting Habitat for Humanity</span></a> | |
| 227 | + </li> | |
| 228 | + <li class="submenu-item" role="none"> | |
| 229 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/programs/myhome-sweepstakes"><span>MyHome Sweepstakes</span></a> | |
| 230 | + </li> | |
| 231 | + </ul> | |
| 232 | + </div> | |
| 233 | + </div> | |
| 234 | + </div> | |
| 235 | + </div> | |
| 236 | + </li> | |
| 237 | + <li class="menu-item " role="none"> | |
| 238 | + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" ><span>RESOURCES</span></a> | |
| 239 | + | |
| 240 | + <div class="megamenu-content"> | |
| 241 | + <div class="container"> | |
| 242 | + <div class="row"> | |
| 243 | + <div class="offset-lg-2 col-lg-3 col-md-6"> | |
| 244 | + <ul role="menu"> | |
| 245 | + <li class="submenu-item" role="none"> | |
| 246 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/satisfying-your-mortgage-conditions"><span>Satisfying Your Mortgage Conditions</span></a> | |
| 247 | + </li> | |
| 248 | + <li class="submenu-item" role="none"> | |
| 249 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/payment-assistance"><span>Payment Assistance</span></a> | |
| 250 | + </li> | |
| 251 | + <li class="submenu-item" role="none"> | |
| 252 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/mortgage-documents"><span>Mortgage Documents</span></a> | |
| 253 | + </li> | |
| 254 | + <li class="submenu-item" role="none"> | |
| 255 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/mortgage-payment-calculator"><span>Mortgage Payment Calculator</span></a> | |
| 256 | + </li> | |
| 257 | + <li class="submenu-item" role="none"> | |
| 258 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/mortgage-videos"><span>Mortgage Videos</span></a> | |
| 259 | + </li> | |
| 260 | + <li class="submenu-item" role="none"> | |
| 261 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/common-mortgage-terminology"><span>Mortgage Glossary</span></a> | |
| 262 | + </li> | |
| 263 | + <li class="submenu-item" role="none"> | |
| 264 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/resources/mymcap"><span>MyMCAP Homeowner Portal</span></a> | |
| 265 | + </li> | |
| 266 | + </ul> | |
| 267 | + </div> | |
| 268 | + </div> | |
| 269 | + </div> | |
| 270 | + </div> | |
| 271 | + </li> | |
| 272 | + <li class="menu-item " role="none"> | |
| 273 | + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="javascript:void(0)" ><span>FOR BROKERS</span></a> | |
| 274 | + | |
| 275 | + <div class="megamenu-content"> | |
| 276 | + <div class="container"> | |
| 277 | + <div class="row"> | |
| 278 | + <div class="offset-lg-2 col-lg-3 col-md-6"> | |
| 279 | + <ul role="menu"> | |
| 280 | + <li class="submenu-item" role="none"> | |
| 281 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/for-brokers/why-work-with-mcap"><span>Why Work with MCAP</span></a> | |
| 282 | + </li> | |
| 283 | + <li class="submenu-item" role="none"> | |
| 284 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/for-brokers/earn-rewards-and-compensation"><span>Broker Rewards & Compensation</span></a> | |
| 285 | + </li> | |
| 286 | + <li class="submenu-item" role="none"> | |
| 287 | + <a role="menuitem" class="submenu-link link link--metis" href="/residential-mortgages/for-brokers/national-sales-team"><span>National Sales Team</span></a> | |
| 288 | + </li> | |
| 289 | + </ul> | |
| 290 | + </div> | |
| 291 | + </div> | |
| 292 | + </div> | |
| 293 | + </div> | |
| 294 | + </li> | |
| 295 | + <li class="menu-item " role="none"> | |
| 296 | + <a role="menuitem" aria-haspopup="true" aria-expanded="false" class="menu-link megamenu-link link link--metis" href="/residential-mortgages/blog" ><span>BLOG</span></a> | |
| 297 | + | |
| 298 | + </li> | |
| 299 | + | |
| 300 | + </ul> | |
| 301 | + </nav> | |
| 302 | + | |
| 303 | + <div class="header-buttons float-right"> | |
| 304 | + | |
| 305 | + <button class="btn btn-primary" onclick="location.href='/residential-mortgages/resources/find-a-mortgage-broker'">FIND A BROKER</button> | |
| 306 | + | |
| 307 | + <div class="search-container"> | |
| 308 | + <button class="search" aria-label="open search form"></button> | |
| 309 | + <div class="search-input-container hidden"> | |
| 310 | + | |
| 311 | +<form action="/Search" id="SearchForm" method="post" name="SearchForm"><input name="__RequestVerificationToken" type="hidden" value="CCMJNxY5opq5EFPfIvButMK7gKN3RyF-PH4hqdSL4uawabWIUwmVQrjGCASidZbuaHDS7bgwCox4qqaeJfSkag2" /> <label class="hidden" for="search">Search site contents</label> | |
| 312 | + <input type="text" title="textInput" name="search" id="search" placeholder="Search"> | |
| 313 | + <button class="search-close" aria-label="close search form"></button> | |
| 314 | +</form> </div> | |
| 315 | + </div> | |
| 316 | + | |
| 317 | + <button class="hamburger" aria-label="Open menu" aria-expanded="false"> | |
| 318 | + <span class="hamburger-shapes"></span> | |
| 319 | + </button> | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + <div class="menu-item login-container disclosure-nav"> | |
| 324 | + <div> | |
| 325 | + <button class="login link link--metis" aria-expanded="true" aria-controls="id_login_menu">LOGIN</button> | |
| 326 | + <div class="megamenu-content login-submenu" id="id_login_menu"> | |
| 327 | + <div class="container"> | |
| 328 | + <div class="row"> | |
| 329 | + <div class="offset-md-9 col-sm-3"> | |
| 330 | + <ul> | |
| 331 | + <li class="submenu-item"> | |
| 332 | + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://www.mcap.com/mymcap/login?lang=en"><span>MyMCAP - HomeOWNER Portal</span></a> | |
| 333 | + </li> | |
| 334 | + <li class="submenu-item"> | |
| 335 | + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://professor.mcap.com/login"><span>Professor - Broker Portal</span></a> | |
| 336 | + </li> | |
| 337 | + <li class="submenu-item"> | |
| 338 | + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://investorlink.mcap.com/account/login"><span>Investor Link</span></a> | |
| 339 | + </li> | |
| 340 | + <li class="submenu-item"> | |
| 341 | + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://lenderlink.mcap.com/account/login"><span>Lender Link</span></a> | |
| 342 | + </li> | |
| 343 | + <li class="submenu-item"> | |
| 344 | + <a class="submenu-link link link--metis signin-link" target="_blank" href="https://mcap.csod.com/ats/careersite/login.aspx"><span>Careers portal</span></a> | |
| 345 | + </li> | |
| 346 | + </ul> | |
| 347 | + </div> | |
| 348 | + </div> | |
| 349 | + </div> | |
| 350 | + | |
| 351 | + </div> | |
| 352 | + </div> | |
| 353 | + </div> | |
| 354 | + | |
| 355 | + </div> | |
| 356 | + | |
| 357 | + <nav class="d-inline" aria-label="mobile menu"> | |
| 358 | + <div class="mobile-menu" aria-hidden="true" style="display: none;"> | |
| 359 | + <a class="mobile-menu-back" href="#!" role="button">back</a> | |
| 360 | + <ul> | |
| 361 | + <li> | |
| 362 | + <a href="/residential-mortgages" class="top-level-menu">RESIDENTIAL MORTGAGES</a> | |
| 363 | + <button class="mobile-menu-expander" aria-label="open Residential Mortgages submenu" data-controls="collapsible-1" role="button" aria-expanded="false" aria-controls="collapsible-1"></button> | |
| 364 | + <ul id="collapsible-1" class="collapsible" aria-hidden="true"> | |
| 365 | + <li> | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + <a href="javascript:void(0);" class="trigger-last-menu">Advice</a> | |
| 370 | + <button class="mobile-menu-clickthrough" aria-label="open Advice submenu" data-controls="collapsible-10" role="button" aria-expanded="false" aria-controls="collapsible-10"></button> | |
| 371 | + | |
| 372 | + <ul id="collapsible-10"> | |
| 373 | + <li> | |
| 374 | + <a class="" href="/residential-mortgages/advice/first-time-home-buyer">Buying Your First Home</a> | |
| 375 | + </li> | |
| 376 | + <li> | |
| 377 | + <a class="" href="/residential-mortgages/advice/existing-home-buyer">Buying Your Next Home</a> | |
| 378 | + </li> | |
| 379 | + <li> | |
| 380 | + <a class="" href="/residential-mortgages/advice/refinance">Refinancing Your Mortgage</a> | |
| 381 | + </li> | |
| 382 | + <li> | |
| 383 | + <a class="" href="/residential-mortgages/advice/secondary-property">Buying a Second Property</a> | |
| 384 | + </li> | |
| 385 | + <li> | |
| 386 | + <a class="" href="/residential-mortgages/advice/renewals">Renewing Your Mortgage</a> | |
| 387 | + </li> | |
| 388 | + <li> | |
| 389 | + <a class="" href="/residential-mortgages/advice/switch-to-mcap">Switching to MCAP</a> | |
| 390 | + </li> | |
| 391 | + <li> | |
| 392 | + <a class="text-accent-green" href="/residential-mortgages/advice/mortgage-rates-canada">Mortgage Rates</a> | |
| 393 | + </li> | |
| 394 | + </ul> | |
| 395 | + </li> | |
| 396 | + <li> | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + <a href="javascript:void(0);" class="trigger-last-menu">Products</a> | |
| 401 | + <button class="mobile-menu-clickthrough" aria-label="open Products submenu" data-controls="collapsible-7077" role="button" aria-expanded="false" aria-controls="collapsible-7077"></button> | |
| 402 | + | |
| 403 | + <ul id="collapsible-7077"> | |
| 404 | + <li> | |
| 405 | + <a class="" href="/residential-mortgages/products/our-mortgages">MCAP Mortgages</a> | |
| 406 | + </li> | |
| 407 | + <li> | |
| 408 | + <a class="" href="/residential-mortgages/products/mortgage-life-and-disability-insurance">Home Mortgage Protection: Mortgage Life & Disability Insurance</a> | |
| 409 | + </li> | |
| 410 | + <li> | |
| 411 | + <a class="" href="/residential-mortgages/products/home-service-plan">Home Service Plan</a> | |
| 412 | + </li> | |
| 413 | + </ul> | |
| 414 | + </li> | |
| 415 | + <li> | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + <a href="javascript:void(0);" class="trigger-last-menu">Programs</a> | |
| 420 | + <button class="mobile-menu-clickthrough" aria-label="open Programs submenu" data-controls="collapsible-7263" role="button" aria-expanded="false" aria-controls="collapsible-7263"></button> | |
| 421 | + | |
| 422 | + <ul id="collapsible-7263"> | |
| 423 | + <li> | |
| 424 | + <a class="" href="/residential-mortgages/programs/property-tax-service">Property Tax Service</a> | |
| 425 | + </li> | |
| 426 | + <li> | |
| 427 | + <a class="" href="/residential-mortgages/programs/register-for-key-to-hope">Key to Hope™ - Supporting Habitat for Humanity</a> | |
| 428 | + </li> | |
| 429 | + <li> | |
| 430 | + <a class="" href="/residential-mortgages/programs/myhome-sweepstakes">MyHome Sweepstakes</a> | |
| 431 | + </li> | |
| 432 | + </ul> | |
| 433 | + </li> | |
| 434 | + <li> | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + <a href="javascript:void(0);" class="trigger-last-menu">Resources</a> | |
| 439 | + <button class="mobile-menu-clickthrough" aria-label="open Resources submenu" data-controls="collapsible-1010" role="button" aria-expanded="false" aria-controls="collapsible-1010"></button> | |
| 440 | + | |
| 441 | + <ul id="collapsible-1010"> | |
| 442 | + <li> | |
| 443 | + <a class="" href="/residential-mortgages/resources/satisfying-your-mortgage-conditions">Satisfying Your Mortgage Conditions</a> | |
| 444 | + </li> | |
| 445 | + <li> | |
| 446 | + <a class="" href="/residential-mortgages/resources/payment-assistance">Payment Assistance</a> | |
| 447 | + </li> | |
| 448 | + <li> | |
| 449 | + <a class="" href="/residential-mortgages/resources/mortgage-documents">Mortgage Documents</a> | |
| 450 | + </li> | |
| 451 | + <li> | |
| 452 | + <a class="" href="/residential-mortgages/resources/mortgage-payment-calculator">Mortgage Payment Calculator</a> | |
| 453 | + </li> | |
| 454 | + <li> | |
| 455 | + <a class="" href="/residential-mortgages/resources/mortgage-videos">Mortgage Videos</a> | |
| 456 | + </li> | |
| 457 | + <li> | |
| 458 | + <a class="" href="/residential-mortgages/resources/common-mortgage-terminology">Mortgage Glossary</a> | |
| 459 | + </li> | |
| 460 | + <li> | |
| 461 | + <a class="" href="/residential-mortgages/resources/mymcap">MyMCAP Homeowner Portal</a> | |
| 462 | + </li> | |
| 463 | + </ul> | |
| 464 | + </li> | |
| 465 | + <li> | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + <a href="javascript:void(0);" class="trigger-last-menu">For Brokers</a> | |
| 470 | + <button class="mobile-menu-clickthrough" aria-label="open For Brokers submenu" data-controls="collapsible-11" role="button" aria-expanded="false" aria-controls="collapsible-11"></button> | |
| 471 | + | |
| 472 | + <ul id="collapsible-11"> | |
| 473 | + <li> | |
| 474 | + <a class="" href="/residential-mortgages/for-brokers/why-work-with-mcap">Why Work with MCAP</a> | |
| 475 | + </li> | |
| 476 | + <li> | |
| 477 | + <a class="" href="/residential-mortgages/for-brokers/earn-rewards-and-compensation">Broker Rewards & Compensation</a> | |
| 478 | + </li> | |
| 479 | + <li> | |
| 480 | + <a class="" href="/residential-mortgages/for-brokers/national-sales-team">National Sales Team</a> | |
| 481 | + </li> | |
| 482 | + </ul> | |
| 483 | + </li> | |
| 484 | + <li> | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + <a href="/residential-mortgages/blog">Blog<span></span></a> | |
| 489 | + | |
| 490 | + <ul id="collapsible-7283"> | |
| 491 | + </ul> | |
| 492 | + </li> | |
| 493 | + </ul> | |
| 494 | + </li> | |
| 495 | + <li> | |
| 496 | + <a href="/commercial-mortgages" class="top-level-menu">COMMERCIAL MORTGAGES</a> | |
| 497 | + <button class="mobile-menu-expander" aria-label="open Commercial Mortgages submenu" data-controls="collapsible-2" role="button" aria-expanded="false" aria-controls="collapsible-2"></button> | |
| 498 | + <ul id="collapsible-2" class="collapsible" aria-hidden="true"> | |
| 499 | + <li> | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + <a href="/commercial-mortgages/products">Products<span></span></a> | |
| 504 | + | |
| 505 | + <ul id="collapsible-1013"> | |
| 506 | + </ul> | |
| 507 | + </li> | |
| 508 | + <li> | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + <a href="/commercial-mortgages/commercial-mortgages-team">Commercial Mortgages Team<span></span></a> | |
| 513 | + | |
| 514 | + <ul id="collapsible-2002"> | |
| 515 | + </ul> | |
| 516 | + </li> | |
| 517 | + <li> | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + <a href="/commercial-mortgages/recent-financings">Recent Financings<span></span></a> | |
| 522 | + | |
| 523 | + <ul id="collapsible-7175"> | |
| 524 | + </ul> | |
| 525 | + </li> | |
| 526 | + <li> | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + <a href="/commercial-mortgages/commercial-process">Commercial Mortgage Process<span></span></a> | |
| 531 | + | |
| 532 | + <ul id="collapsible-7167"> | |
| 533 | + </ul> | |
| 534 | + </li> | |
| 535 | + <li> | |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + <a href="/commercial-mortgages/newsletter">Newsletter<span></span></a> | |
| 540 | + | |
| 541 | + <ul id="collapsible-7327"> | |
| 542 | + </ul> | |
| 543 | + </li> | |
| 544 | + <li> | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + <a href="/commercial-mortgages/blog">Blog<span></span></a> | |
| 549 | + | |
| 550 | + <ul id="collapsible-7284"> | |
| 551 | + </ul> | |
| 552 | + </li> | |
| 553 | + </ul> | |
| 554 | + </li> | |
| 555 | + <li> | |
| 556 | + <a href="/development-finance" class="top-level-menu">DEVELOPMENT FINANCE</a> | |
| 557 | + <button class="mobile-menu-expander" aria-label="open Development Finance submenu" data-controls="collapsible-3" role="button" aria-expanded="false" aria-controls="collapsible-3"></button> | |
| 558 | + <ul id="collapsible-3" class="collapsible" aria-hidden="true"> | |
| 559 | + <li> | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + <a href="/development-finance/financing-options">Financing Categories<span></span></a> | |
| 564 | + | |
| 565 | + <ul id="collapsible-1008"> | |
| 566 | + </ul> | |
| 567 | + </li> | |
| 568 | + <li> | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + <a href="/development-finance/recent-financings">Recent Financings<span></span></a> | |
| 573 | + | |
| 574 | + <ul id="collapsible-7135"> | |
| 575 | + </ul> | |
| 576 | + </li> | |
| 577 | + <li> | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + <a href="/development-finance/development-finance-team">Development Finance Team<span></span></a> | |
| 582 | + | |
| 583 | + <ul id="collapsible-7096"> | |
| 584 | + </ul> | |
| 585 | + </li> | |
| 586 | + <li> | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + <a href="/development-finance/blog">Blog<span></span></a> | |
| 591 | + | |
| 592 | + <ul id="collapsible-7285"> | |
| 593 | + </ul> | |
| 594 | + </li> | |
| 595 | + <li> | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + <a href="/development-finance/land-lot-value-report">Land Lot Value Report<span></span></a> | |
| 600 | + | |
| 601 | + <ul id="collapsible-7306"> | |
| 602 | + </ul> | |
| 603 | + </li> | |
| 604 | + </ul> | |
| 605 | + </li> | |
| 606 | + | |
| 607 | + <li> | |
| 608 | + <a href="/corporate/about-mcap" class="top-level-menu">ABOUT MCAP</a> | |
| 609 | + | |
| 610 | + <button class="mobile-menu-expander" aria-label="open About MCAP submenu" data-controls="collapsible-4" role="button" aria-expanded="false" aria-controls="collapsible-4"></button> | |
| 611 | + <ul id="collapsible-4" class="collapsible" aria-hidden="true"> | |
| 612 | + <li> | |
| 613 | + <a class="" class="" href="/corporate/about-mcap/charitable-initiatives">Charitable Initiatives</a> | |
| 614 | + </li> | |
| 615 | + <li> | |
| 616 | + <a class="" class="" href="/corporate/about-mcap/executive-team">Executive Team</a> | |
| 617 | + </li> | |
| 618 | + <li> | |
| 619 | + <a class="" class="" href="/corporate/about-mcap/blue-culture">Blue Culture</a> | |
| 620 | + </li> | |
| 621 | + </ul> | |
| 622 | + | |
| 623 | + </li> | |
| 624 | + | |
| 625 | + <li> | |
| 626 | + <a href="/corporate/careers" class="top-level-menu">CAREERS</a> | |
| 627 | + <button class="mobile-menu-expander" aria-label="open Careers submenu" data-controls="collapsible-7189" role="button" aria-expanded="false" aria-controls="collapsible-7189"></button> | |
| 628 | + <ul id="collapsible-7189" class="collapsible" aria-hidden="true"> | |
| 629 | + <li> | |
| 630 | + <a class="" href="/corporate/careers/your-career-journey">Your Career Journey</a> | |
| 631 | + </li> | |
| 632 | + <li> | |
| 633 | + <a class="" href="/corporate/careers/students">Students & New Grads</a> | |
| 634 | + </li> | |
| 635 | + <li> | |
| 636 | + <a class="" href="/corporate/careers/opportunities">Opportunities</a> | |
| 637 | + </li> | |
| 638 | + <li> | |
| 639 | + <a class="" href="/corporate/careers/employee-spotlight">Employee Spotlight</a> | |
| 640 | + </li> | |
| 641 | + </ul> | |
| 642 | + | |
| 643 | + </li> | |
| 644 | + | |
| 645 | + <li> | |
| 646 | + <a href="/contact-us" class="top-level-menu">CONTACT US</a> | |
| 647 | + <button class="mobile-menu-expander" aria-label="open Contact Us submenu" data-controls="collapsible-7256" role="button" aria-expanded="false" aria-controls="collapsible-7256"></button> | |
| 648 | + <ul id="collapsible-7256" class="collapsible" aria-hidden="true"> | |
| 649 | + <li> | |
| 650 | + <a class="" href="/contact-us/residential-mortgages">Contact The Residential Team</a> | |
| 651 | + </li> | |
| 652 | + <li> | |
| 653 | + <a class="" href="/contact-us/commercial-mortgages">Contact The Commercial Team</a> | |
| 654 | + </li> | |
| 655 | + <li> | |
| 656 | + <a class="" href="/contact-us/development-finance">Development Finance Contact </a> | |
| 657 | + </li> | |
| 658 | + <li> | |
| 659 | + <a class="" href="/contact-us/corporate-office">Corporate Inquiries</a> | |
| 660 | + </li> | |
| 661 | + </ul> | |
| 662 | + | |
| 663 | + </li> | |
| 664 | + | |
| 665 | + <li class="mobile-lang-toggle"> | |
| 666 | + <a class="small font-weight-300" href="/fr/residentiel/conseils/taux-hypothecaires-canada">FR</a> | |
| 667 | + <br /><br /><a class="small font-weight-300" href="/residential-mortgages/resources/find-a-mortgage-broker">FIND A BROKER</a> | |
| 668 | + | |
| 669 | + </li> | |
| 670 | + <li> | |
| 671 | + <a href="#!" class="top-level-menu collapse-trigger menu-trigger" data-controls="login-collapsible">Login</a> | |
| 672 | + <button class="mobile-menu-expander" aria-label="open Login submenu" data-controls="login-collapsible" role="button" aria-expanded="false" aria-controls="login-collapsible"></button> | |
| 673 | + <ul class="collapsible" id="login-collapsible" aria-hidden="true"> | |
| 674 | + <li class="signin-link"> | |
| 675 | + <a class="signin-link" target="_blank" href="https://www.mcap.com/mymcap/login?lang=en">MyMCAP - HomeOWNER Portal</a> | |
| 676 | + </li> | |
| 677 | + <li class="signin-link"> | |
| 678 | + <a class="signin-link" target="_blank" href="https://professor.mcap.com/login">Professor - Broker Portal</a> | |
| 679 | + </li> | |
| 680 | + <li class="signin-link"> | |
| 681 | + <a class="signin-link" target="_blank" href="https://investorlink.mcap.com/account/login">Investor Link</a> | |
| 682 | + </li> | |
| 683 | + <li class="signin-link"> | |
| 684 | + <a class="signin-link" target="_blank" href="https://lenderlink.mcap.com/account/login">Lender Link</a> | |
| 685 | + </li> | |
| 686 | + <li class="signin-link"> | |
| 687 | + <a class="signin-link" target="_blank" href="https://mcap.csod.com/ats/careersite/login.aspx">Careers portal</a> | |
| 688 | + </li> | |
| 689 | + </ul> | |
| 690 | + </li> | |
| 691 | + | |
| 692 | + </ul> | |
| 693 | + </div> | |
| 694 | + </nav> | |
| 695 | + | |
| 696 | + </div> | |
| 697 | +</header> | |
| 698 | + | |
| 699 | +<script type="text/javascript"> | |
| 700 | + | |
| 701 | + | |
| 702 | + | |
| 703 | + setTimeout(function () { | |
| 704 | + $('#SearchForm').submit(function () { | |
| 705 | + | |
| 706 | + if ($.trim($("#search").val()) === "") { | |
| 707 | + return false; | |
| 708 | + } | |
| 709 | + }); | |
| 710 | + | |
| 711 | + $('#search').keypress(function (e) { | |
| 712 | + | |
| 713 | + var key = e.which; | |
| 714 | + | |
| 715 | + if (key == 13) // the enter key code | |
| 716 | + { | |
| 717 | + if (window.location.href.indexOf('/fr') >= 0) { | |
| 718 | + changeSearchLanguage('fr'); | |
| 719 | + event.preventDefault(); | |
| 720 | + } else { | |
| 721 | + console.log("en"); | |
| 722 | + changeSearchLanguage('en'); | |
| 723 | + event.preventDefault(); | |
| 724 | + } | |
| 725 | + return false; | |
| 726 | + } | |
| 727 | + | |
| 728 | + }); | |
| 729 | + | |
| 730 | + | |
| 731 | + $('#englishSearch').click(function (event) { | |
| 732 | + changeSearchLanguage('en'); | |
| 733 | + event.preventDefault(); | |
| 734 | + }); | |
| 735 | + | |
| 736 | + $('#frenchSearch').click(function (event) { | |
| 737 | + changeSearchLanguage('fr'); | |
| 738 | + event.preventDefault(); | |
| 739 | + }); | |
| 740 | + | |
| 741 | + }, 500); | |
| 742 | + | |
| 743 | + function changeSearchLanguage(language) { | |
| 744 | + | |
| 745 | + console.log("changeSearchLanguage"); | |
| 746 | + var form = $('#__AjaxAntiForgeryForm'); | |
| 747 | + var token = $('input[name="__RequestVerificationToken"]', form).val(); | |
| 748 | + | |
| 749 | + var searchQuery = ''; | |
| 750 | + if ($.trim($("#search").val()) != '') { | |
| 751 | + searchQuery = "&isModern=true&search=" + $.trim($("#search").val()); | |
| 752 | + } | |
| 753 | + | |
| 754 | + | |
| 755 | + var location; | |
| 756 | + if (!(window.location.href.indexOf('/fr/') >= 0) && language === 'fr') { | |
| 757 | + location = window.location.protocol + | |
| 758 | + '//' + | |
| 759 | + window.location.hostname + | |
| 760 | + ':' + | |
| 761 | + window.location.port + | |
| 762 | + "/fr/Search?languageCode=" + | |
| 763 | + language + | |
| 764 | + searchQuery; | |
| 765 | + } else if (window.location.href.indexOf('/fr/') >= 0 && language === 'en') { | |
| 766 | + location = window.location.protocol + | |
| 767 | + '//' + | |
| 768 | + window.location.hostname + | |
| 769 | + ':' + | |
| 770 | + window.location.port + | |
| 771 | + "/" + | |
| 772 | + window.location.pathname + | |
| 773 | + "?languageCode=" + | |
| 774 | + language + | |
| 775 | + searchQuery; | |
| 776 | + location = location.replace('/fr/', ''); | |
| 777 | + } else if (language === 'fr') { | |
| 778 | + location = window.location.protocol + | |
| 779 | + '//' + | |
| 780 | + window.location.hostname + | |
| 781 | + ':' + | |
| 782 | + window.location.port + | |
| 783 | + "/fr/Search?languageCode=" + | |
| 784 | + language + | |
| 785 | + searchQuery; | |
| 786 | + } else { | |
| 787 | + location = window.location.protocol + | |
| 788 | + '//' + | |
| 789 | + window.location.hostname + | |
| 790 | + ':' + | |
| 791 | + window.location.port + | |
| 792 | + '/Search?languageCode=' + | |
| 793 | + language + | |
| 794 | + searchQuery; | |
| 795 | + } | |
| 796 | + | |
| 797 | + console.log("location", location); | |
| 798 | + window.location.href = location; | |
| 799 | + } | |
| 800 | + | |
| 801 | + | |
| 802 | +</script> | |
| 803 | + | |
| 804 | + | |
| 805 | + <main id="main"> | |
| 806 | + | |
| 807 | + | |
| 808 | + | |
| 809 | + | |
| 810 | + | |
| 811 | + | |
| 812 | + | |
| 813 | + | |
| 814 | + | |
| 815 | + | |
| 816 | +<div class="jumbotron jumbotron-fluid bg-primary-blue" id="rimagebanner_1"> | |
| 817 | + <div class="container"> | |
| 818 | + <div class="row"> | |
| 819 | + <div class="col-md-4 jumbotron-content-wpr"> | |
| 820 | + <h1 class="text-white">Mortgage Rates</h1> | |
| 821 | + <p class="text-white"> | |
| 822 | + MCAP offers competitive rates — plus other mortgage features — to help you finance your next home. | |
| 823 | + </p> | |
| 824 | + | |
| 825 | + | |
| 826 | + | |
| 827 | + | |
| 828 | + </div> | |
| 829 | + | |
| 830 | + | |
| 831 | + </div> | |
| 832 | + </div> | |
| 833 | + | |
| 834 | + | |
| 835 | + <div class="jumbotron-image-container-desktop mcap-polygon-left-clip"> | |
| 836 | + <img src="/Content/MCAP/UploadedImages/advice-rates-hero1_6235ae4.jpg" class="obj-pos-h-center" alt="" /> | |
| 837 | + </div> | |
| 838 | + <div class="jumbotron-image-container-mobile mcap-polygon-left-clip-mobile"> | |
| 839 | + <img src="/Content/MCAP/UploadedImages/advice-rates-hero1_6235ae4.jpg" class="obj-pos-h-center" alt="" /> | |
| 840 | + </div> | |
| 841 | +</div> | |
| 842 | + | |
| 843 | +<script type="text/javascript"> | |
| 844 | + setTimeout(function () { | |
| 845 | + $("#btnHero_1").click(function () { | |
| 846 | + location.href = ''; | |
| 847 | + }); | |
| 848 | + }, 500); | |
| 849 | +</script> | |
| 850 | + | |
| 851 | + | |
| 852 | + | |
| 853 | +<div class="container-fluid" id="limagecnt_2"> | |
| 854 | + <div class="container"> | |
| 855 | + <div class="row mb-5 article-list-row big-img"> | |
| 856 | + <div class="col-sm-6 pr-0"> | |
| 857 | + <div class="article-img"> | |
| 858 | + <img src="/Content/MCAP/UploadedImages/advice-rates-content2_0f334a4.jpg" alt="" /> | |
| 859 | + </div> | |
| 860 | + </div> | |
| 861 | + <div class="col-sm-6 pl-sm-4"> | |
| 862 | + <div class="article-body"> | |
| 863 | + <!--Title--> | |
| 864 | + <h2 class="text-primary-blue h3">There’s more to consider than rates</h2> | |
| 865 | + | |
| 866 | + <!--Description--> | |
| 867 | + <p class="text-tertiary-grey"> | |
| 868 | + When buying a home, mortgage rates are an important part of the conversation — but they’re not the whole story. When choosing a mortgage, it’s also important to consider: | |
| 869 | + </p> | |
| 870 | + | |
| 871 | + <!--Bullet List--> | |
| 872 | + <ul class="disc-list text-tertiary-grey font-weight-300"> | |
| 873 | + <li>The flexibility of the payment schedule</li> | |
| 874 | + <li>Available options to pay down the mortgage faster</li> | |
| 875 | + <li>Whether you can take your mortgage with you when you move</li> | |
| 876 | + </ul> | |
| 877 | + | |
| 878 | + <!--Link--> | |
| 879 | + <p class="mt-1"> | |
| 880 | + <a href="/residential-mortgages/products/our-mortgages" class="green-arrow-link d-inline-block font-weight-700 text-underline">View MCAP mortgages</a> | |
| 881 | + </p> | |
| 882 | + | |
| 883 | + | |
| 884 | + </div> | |
| 885 | + </div> | |
| 886 | + </div> | |
| 887 | + </div> | |
| 888 | +</div> | |
| 889 | + | |
| 890 | + | |
| 891 | +<div class="container-fluid" id="rimagecnt_3"> | |
| 892 | + <div class="container"> | |
| 893 | + <div class="row my-5 article-list-row big-img d-flex flex-column-reverse flex-sm-row"> | |
| 894 | + <div class="col-sm-6 pr-0"> | |
| 895 | + <div class="article-body"> | |
| 896 | + <!--Title--> | |
| 897 | + <h2 class="text-primary-blue h3">Finding the right mortgage</h2> | |
| 898 | + | |
| 899 | + <!--Description--> | |
| 900 | + <p class="text-tertiary-grey"> | |
| 901 | + Do you prefer the stability of a fixed rate or the flexibility of a variable rate? Are you planning to be in your home for a long time or only for a specific period of time? Your priorities, goals, and lifestyle all factor into your mortgage decision. A broker can help guide you to the mortgage that’s right for you. | |
| 902 | + </p> | |
| 903 | + | |
| 904 | + <!--Bullet List--> | |
| 905 | + | |
| 906 | + <!--Link--> | |
| 907 | + <p class="mt-1"> | |
| 908 | + <a href="/residential-mortgages/resources/find-a-mortgage-broker" class="green-arrow-link d-inline-block font-weight-700 text-underline">Find a mortgage broker</a> | |
| 909 | + </p> | |
| 910 | + | |
| 911 | + | |
| 912 | + </div> | |
| 913 | + </div> | |
| 914 | + <div class="col-sm-6 pl-sm-4"> | |
| 915 | + <div class="article-img"> | |
| 916 | + <img src="/Content/MCAP/UploadedImages/advice-rates-content2-2_bcd2cf4.jpg" alt="" /> | |
| 917 | + </div> | |
| 918 | + </div> | |
| 919 | + </div> | |
| 920 | + </div> | |
| 921 | +</div> | |
| 922 | + | |
| 923 | + | |
| 924 | + | |
| 925 | +<div class="container-fluid charts1 bg-accent-superlight-grey" id="comparison_4"> | |
| 926 | + <div class="container"> | |
| 927 | + <div class="row"> | |
| 928 | + <div class="col-sm-12 d-flex flex-column px-0"> | |
| 929 | + <h2 class="text-left text-sm-center font-weight-700 text-primary-blue">Fixed vs. Adjustable Rate Mortgages</h2> | |
| 930 | + <p class="text-left text-sm-center text-tertiary-grey mb-30"> | |
| 931 | + Before deciding whether a fixed or adjustable rate mortgage is right for you, take a look at the features of each mortgage type below. | |
| 932 | + </p> | |
| 933 | + | |
| 934 | + <div class="compare-container eq-h" data-col-sel=".compare-col"> | |
| 935 | + <div class="col-left float-left compare-col"> | |
| 936 | + <h3 class="text-primary-blue mb-20">Fixed</h3> | |
| 937 | + <p class="text-tertiary-grey plus-p"> | |
| 938 | + <span class="text-accent-green font-weight-700">+ </span>The interest rate is locked in for the full term of the mortgage | |
| 939 | + </p> | |
| 940 | + <p class="text-tertiary-grey plus-p"> | |
| 941 | + <span class="text-accent-green font-weight-700">+ </span>Principal and interest payments are guaranteed not to change throughout your term | |
| 942 | + </p> | |
| 943 | + <p class="text-tertiary-grey plus-p"> | |
| 944 | + <span class="text-accent-green font-weight-700">+ </span>You have the option to pay down your mortgage faster with certain lump-sum and pre-payment privileges | |
| 945 | + </p> | |
| 946 | + </div> | |
| 947 | + <div class="col-right float-left compare-col"> | |
| 948 | + <h3 class="text-primary-blue mb-20">Adjustable</h3> | |
| 949 | + <p class="text-tertiary-grey plus-p"> | |
| 950 | + <span class="text-accent-green font-weight-700">+ </span>If interest rates fluctuate up or down your mortgage rate will do the same | |
| 951 | + </p> | |
| 952 | + <p class="text-tertiary-grey plus-p"> | |
| 953 | + <span class="text-accent-green font-weight-700">+ </span>Your regular payment will also go up or down in relation to the rise and fall of interest rates | |
| 954 | + </p> | |
| 955 | + <p class="text-tertiary-grey plus-p"> | |
| 956 | + <span class="text-accent-green font-weight-700">+ </span>Provides the option to convert to a fixed rate mortgage anytime — so you can take advantage of falling rates | |
| 957 | + </p> | |
| 958 | + <p class="text-tertiary-grey plus-p"> | |
| 959 | + <span class="text-accent-green font-weight-700">+ </span>You have the option to pay down your mortgage faster with certain lump-sum and pre-payment privileges | |
| 960 | + </p> | |
| 961 | + </div> | |
| 962 | + </div> | |
| 963 | + | |
| 964 | + </div> | |
| 965 | + </div> | |
| 966 | + <div class="row"> | |
| 967 | + <div class="col-sm-12 text-center"> | |
| 968 | + <!-- <p> --> | |
| 969 | + <button class="btn btn-primary d-inline-block" id="cmpBtn_4">CALCULATE</button> | |
| 970 | + <!-- </p> --> | |
| 971 | + <p class="text-center text-tertiary-grey mt-2"> | |
| 972 | + Discover how much your mortgage payments could be and compare different mortgage options to find what works best for you. | |
| 973 | + </p> | |
| 974 | + </div> | |
| 975 | + </div> | |
| 976 | + </div> | |
| 977 | +</div> | |
| 978 | + | |
| 979 | + | |
| 980 | +<script type="text/javascript"> | |
| 981 | + $(function() { | |
| 982 | + $("#cmpBtn_4").click(function () { | |
| 983 | + location.href = '/residential-mortgages/resources/mortgage-payment-calculator'; | |
| 984 | + }); | |
| 985 | + }); | |
| 986 | +</script> | |
| 987 | + | |
| 988 | + | |
| 989 | +<div class="container-fluid big-blue-bar simple d-flex justify-content-center flex-column inverse-bg-sm mb-5 prime-rate-module" id="ctap_5"> | |
| 990 | + <div class="container text-left px-0 px-sm-3"> | |
| 991 | + <div class="row"> | |
| 992 | + <div class="col-lg-6 col-md-5 top-text-container"> | |
| 993 | + <h3 class="text-white mb-1 font-36 font-weight-700">Current prime rate</h3> | |
| 994 | + <p class="text-white mb-0 font-weight-300">The prime rate is the annual interest rate that major banks and lenders within Canada use to set variable-rate mortgages, such as the MCAP adjustable rate mortgage. The prime rate is influenced by the rate set by the Bank of Canada.<br><a href="/residential-mortgages/advice/mortgage-rates-canada/prime-rate-history">View historical rates</a></p> | |
| 995 | + </div> | |
| 996 | + <div class="offset-0 col-6 offset-md-1 col-md-3 col-lg-2 d-flex align-items-start justify-content-center flex-column"> | |
| 997 | + <p class="text-white mb-0 font-weight-300 align-self-start mb-3">MCAP Prime Rate</p> | |
| 998 | + <p class="h2 round-number-box text-white bg-primary-blue font-weight-700 text-center"> | |
| 999 | + 4.45% | |
| 1000 | + </p> | |
| 1001 | + </div> | |
| 1002 | + <div class="col-6 col-md-3 col-lg-3 d-flex align-items-center justify-content-start"> | |
| 1003 | + <p class="text-white big mt-4 font-weight-700 pl-3 pt-3"> | |
| 1004 | + Effective October 30, 2025 | |
| 1005 | + </p> | |
| 1006 | + </div> | |
| 1007 | + </div> | |
| 1008 | + | |
| 1009 | + </div> | |
| 1010 | +</div> | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + <div class="container-fluid bg-accent-superlight-grey cta-hero cta-clipped" id="fwbanner_6"> | |
| 1014 | + <div class="cta-hero-image-container-desktop mcap-polygon-right-clip-banner"> | |
| 1015 | + <img src="/Content/MCAP/UploadedImages/Enrich-Your-Mortgage-cta6_1053154.jpg" alt="" class="obj-pos-h-center" /> | |
| 1016 | + </div> | |
| 1017 | + | |
| 1018 | + <div class="container mt-2 mt-sm-0"> | |
| 1019 | + <div class="row"> | |
| 1020 | + <div class="offset-0 offset-sm-6 col-sm-6 cta-clipped-text"> | |
| 1021 | + <h2 class="text-primary-blue mb-30">Enrich Your Mortgage Rate Knowledge</h2> | |
| 1022 | + <p class="small text-tertiary-grey mb-30 font-weight-300"> | |
| 1023 | + The mortgage process can be complex but we’re here to help. Find the answers to all your mortgage, rate and payment questions in our ultimate guide to mortgage rates in Canada. | |
| 1024 | + </p> | |
| 1025 | + <a href="https://www.mcap.com/residential-mortgages/advice/mortgage-rates-canada/the-ultimate-guide-to-mortgage-rates-in-canada" class="green-arrow-link text-underline">Explore the Guide</a> | |
| 1026 | + </div> | |
| 1027 | + | |
| 1028 | + </div> | |
| 1029 | + </div> | |
| 1030 | + </div> | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | +<div class="container-fluid big-blue-bar" id="cta_7"> | |
| 1035 | + <div class="container text-center"> | |
| 1036 | + <h2 class="text-white h3">Talk to a broker for our current rates</h2> | |
| 1037 | + <p class="text-white h4">MCAP mortgage brokers can walk you through our current mortgage rates and help you choose a mortgage that meets your needs.</p> | |
| 1038 | + <button class="btn btn-tertiary" id="contactBtn_7" data-url="/residential-mortgages/resources/find-a-mortgage-broker">FIND A BROKER</button> | |
| 1039 | + | |
| 1040 | + </div> | |
| 1041 | +</div> | |
| 1042 | + | |
| 1043 | + <script type="text/javascript"> | |
| 1044 | + setTimeout(function () { | |
| 1045 | + $("#contactBtn_7").click(function () { | |
| 1046 | + location.href = '/residential-mortgages/resources/find-a-mortgage-broker'; | |
| 1047 | + }); | |
| 1048 | + }, 500); | |
| 1049 | + </script> | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + </main> | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + <!-- Footer --> | |
| 1060 | + <footer> | |
| 1061 | + <div class="footer container-fluid"> | |
| 1062 | + <div class="container"> | |
| 1063 | + <div class="row"> | |
| 1064 | + <div class="col-sm-3 footer-logo-container"> | |
| 1065 | + <img class="footer-logo" src="/Content/MCAP/Modern/assets/images/logos/mcap-inverse.svg" alt="MCAP logo" /> | |
| 1066 | + </div> | |
| 1067 | + <div class="col-md-2"> | |
| 1068 | + <ul class="footer-links"> | |
| 1069 | + <li> | |
| 1070 | + <span class="font-weight-300">COMPANY</span> | |
| 1071 | + </li> | |
| 1072 | + | |
| 1073 | + <li> | |
| 1074 | + <a href="/corporate/about-mcap">ABOUT MCAP</a> | |
| 1075 | + </li> | |
| 1076 | + | |
| 1077 | + <li> | |
| 1078 | + <a href="/corporate/careers">CAREERS</a> | |
| 1079 | + </li> | |
| 1080 | + </ul> | |
| 1081 | + </div> | |
| 1082 | + <div class="col-md-3"> | |
| 1083 | + <ul class="footer-links"> | |
| 1084 | + <li> | |
| 1085 | + <span class="font-weight-300">INFO</span> | |
| 1086 | + </li> | |
| 1087 | + | |
| 1088 | + <li> | |
| 1089 | + <a href="/corporate/institutional-investor">INSTITUTIONAL INVESTOR</a> | |
| 1090 | + </li> | |
| 1091 | + | |
| 1092 | + <li> | |
| 1093 | + <a href="/corporate/outsourcing-mortgages">OUTSOURCING MORTGAGES</a> | |
| 1094 | + </li> | |
| 1095 | + </ul> | |
| 1096 | + </div> | |
| 1097 | + <div class="col-md-2"> | |
| 1098 | + <ul class="footer-links social-links"> | |
| 1099 | + <li> | |
| 1100 | + <a href="https://www.linkedin.com/company/mcap/" class="linkedin social-link" target="_blank">LINKEDIN</a> | |
| 1101 | + </li> | |
| 1102 | + | |
| 1103 | + <li> | |
| 1104 | + <a href="https://www.facebook.com/MCAPResidential/" class="facebook social-link" target="_blank">FACEBOOK</a> | |
| 1105 | + </li> | |
| 1106 | + | |
| 1107 | + </ul> | |
| 1108 | + </div> | |
| 1109 | + <div class="top-btn-container"> | |
| 1110 | + <a href="#navbar-main" style="background-color: #FFFFFF; border-radius: 5rem;" class="scroll-top float-end" aria-label="back to top"> | |
| 1111 | + TOP | |
| 1112 | + </a> | |
| 1113 | + </div> | |
| 1114 | + </div> | |
| 1115 | + <div class="row d-flex d-sm-none mb-0"> | |
| 1116 | + <div class="col-sm-12 mb-0"> | |
| 1117 | + <ul class="footer-links-bottom float-end footer-links-bottom-right"> | |
| 1118 | + <li> | |
| 1119 | + <a href="/corporate/legal">LEGAL</a> <span> | </span> | |
| 1120 | + </li> | |
| 1121 | + <li> | |
| 1122 | + <a href="/corporate/privacy">SECURITY, PRIVACY & AML</a> <span> | </span> | |
| 1123 | + </li> | |
| 1124 | + <li> | |
| 1125 | + <a href="/corporate/accessibility">ACCESSIBILITY</a> <span> | </span> | |
| 1126 | + </li> | |
| 1127 | + <li> | |
| 1128 | + <a href="/corporate/licenses">LICENSES</a> | |
| 1129 | + </li> | |
| 1130 | + </ul> | |
| 1131 | + </div> | |
| 1132 | + </div> | |
| 1133 | + <div class="row border-top"> | |
| 1134 | + <div class="col-sm-3"> | |
| 1135 | + <p> | |
| 1136 | + © Copyright | |
| 1137 | + </p> | |
| 1138 | + </div> | |
| 1139 | + <div class="col-sm-9 d-none d-sm-block"> | |
| 1140 | + <ul class="footer-links-bottom float-end footer-links-bottom-right"> | |
| 1141 | + <li> | |
| 1142 | + <a href="/corporate/legal">LEGAL</a> <span> | </span> | |
| 1143 | + </li> | |
| 1144 | + <li> | |
| 1145 | + <a href="/corporate/privacy">SECURITY, PRIVACY & AML</a> <span> | </span> | |
| 1146 | + </li> | |
| 1147 | + <li> | |
| 1148 | + <a href="/corporate/accessibility">ACCESSIBILITY</a> <span> | </span> | |
| 1149 | + </li> | |
| 1150 | + <li> | |
| 1151 | + <a href="/corporate/licenses">LICENSES</a> | |
| 1152 | + </li> | |
| 1153 | + </ul> | |
| 1154 | + </div> | |
| 1155 | + </div> | |
| 1156 | + </div> | |
| 1157 | + </div> | |
| 1158 | + </footer> | |
| 1159 | + <svg width="0" height="0" class="mcap-svg"> | |
| 1160 | + <defs> | |
| 1161 | + <clipPath id="clip-shape" clipPathUnits="objectBoundingBox" transform="scale(0.001396648045, 0.001560062402)"> | |
| 1162 | + <path d="M514 0L0 6.10352e-05V642H530L690.302 364.678C706.104 337.34 705.45 303.496 688.603 276.79L514 0Z" /> | |
| 1163 | + </clipPath> | |
| 1164 | + </defs> | |
| 1165 | + </svg> | |
| 1166 | + | |
| 1167 | + <svg width="0" height="0" class="mcap-svg"> | |
| 1168 | + <defs> | |
| 1169 | + <clipPath id="clip-shape-left" clipPathUnits="objectBoundingBox" transform="scale(0.000520833333, 0.001445086705)"> | |
| 1170 | + <path d="M1028 -59L1920 -59V695H973L809.811 415.803C792.613 386.378 792.495 349.995 809.502 320.459L1028 -59Z" /> | |
| 1171 | + </clipPath> | |
| 1172 | + </defs> | |
| 1173 | + </svg> | |
| 1174 | + | |
| 1175 | + <svg width="0" height="0" class="mcap-svg"> | |
| 1176 | + <defs> | |
| 1177 | + <clipPath id="clip-shape-vert" clipPathUnits="objectBoundingBox" transform="scale(0.00265957446, 0.00272479564)"> | |
| 1178 | + <path d="M376 272.282L376 0L0 0L0 287.847L137.043 349.108C162.44 360.461 191.536 360.112 216.652 348.153L376 272.282Z" /> | |
| 1179 | + </clipPath> | |
| 1180 | + </defs> | |
| 1181 | + </svg> | |
| 1182 | + | |
| 1183 | + | |
| 1184 | + <!--global--> | |
| 1185 | + <script> | |
| 1186 | + let numFormatter_en = new Intl.NumberFormat('en-CA', { style: 'currency', currency: 'CAD' }); | |
| 1187 | + let numFormatter_fr = new Intl.NumberFormat('fr-CA', { style: 'currency', currency: 'CAD' }); | |
| 1188 | + let decimalFormatter_en = new Intl.NumberFormat('en-CA', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); | |
| 1189 | + let decimalFormatter_fr = new Intl.NumberFormat('fr-CA', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); | |
| 1190 | + let appLang = 'True' === 'True' ? 'en' : 'fr'; | |
| 1191 | + </script> | |
| 1192 | + <!-- Bootstrap core JS--> | |
| 1193 | + <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> | |
| 1194 | + <script src="/Scripts/bootstrap.bundle.min.js"></script> | |
| 1195 | + <!-- Core theme JS--> | |
| 1196 | + <script src="/Content/MCAP/Modern/js/scripts.js?v=3"></script> | |
| 1197 | + <!-- Core plugins--> | |
| 1198 | + <script src="/Content/MCAP/Modern/js/custom-select.min.js"></script> | |
| 1199 | + <script src="/Content/MCAP/Modern/js/tiny-slider.js"></script> | |
| 1200 | + | |
| 1201 | + <script src="/Content/MCAP/Modern/js/MenubarLinks.js"></script> | |
| 1202 | + <script src="/Content/MCAP/Modern/js/MenubarItemLinks.js"></script> | |
| 1203 | + <script src="/Content/MCAP/Modern/js/PopupMenuLinks.js"></script> | |
| 1204 | + <script src="/Content/MCAP/Modern/js/PopupMenuItemLinks.js"></script> | |
| 1205 | + <script src="/Content/MCAP/Modern/js/disclosureMenu.js"></script> | |
| 1206 | + <script src="/Content/MCAP/Modern/js/listbox.js"></script> | |
| 1207 | + <script src="/Content/MCAP/Modern/js/listbox-collapsible.js"></script> | |
| 1208 | + <script src="/Content/MCAP/Modern/js/utils.js"></script> | |
| 1209 | + | |
| 1210 | + | |
| 1211 | +<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> | |
| 1212 | + | |
| 1213 | + <div id="consent-popup"> | |
| 1214 | + <h2 class="titleText">We value your privacy</h2> | |
| 1215 | + <div id="consent-popup-content-container"> | |
| 1216 | + <p id="consent-popup-content"> | |
| 1217 | + By clicking “ACCEPT ALL”, you consent to our use of cookies and other | |
| 1218 | + technologies that collect information about website visitor activity to | |
| 1219 | + enhance your browsing experience, analyze our website usage and traffic, | |
| 1220 | + and serve personalized ads. View our | |
| 1221 | + <a id="privacy-link" href="/corporate/privacy" target="_blank" rel="noopener" | |
| 1222 | + >Privacy page</a | |
| 1223 | + > | |
| 1224 | + to learn more. | |
| 1225 | + </p> | |
| 1226 | + </div> | |
| 1227 | + | |
| 1228 | + <div class="button-row center"> | |
| 1229 | + <button id="accept-consent" class="btn btn-tertiary text-uppercase btn-margin-right" type="submit"> | |
| 1230 | + Accept All</button | |
| 1231 | + ><button id="reject-consent" class="btn btn-tertiary text-uppercase" type="submit"> | |
| 1232 | + Reject All | |
| 1233 | + </button> | |
| 1234 | + </div> | |
| 1235 | +</div> | |
| 1236 | + | |
| 1237 | + <script> | |
| 1238 | + var menubar = new Menubar(document.getElementById('mainNav')); | |
| 1239 | + menubar.init(); | |
| 1240 | + | |
| 1241 | + $('#accept-consent').click(async function () { | |
| 1242 | + $(this).parent().parent().hide(); | |
| 1243 | + try { | |
| 1244 | + let response = await fetch('../accept-consent'); | |
| 1245 | + if (!response) { | |
| 1246 | + throw new Error('Network response was not ok') | |
| 1247 | + } | |
| 1248 | + } | |
| 1249 | + catch (error) { | |
| 1250 | + console.log("There was a problem with fetch operation", error) | |
| 1251 | + } | |
| 1252 | + location.reload(); | |
| 1253 | + }); | |
| 1254 | + | |
| 1255 | + $('#reject-consent').click(async function () { | |
| 1256 | + $(this).parent().parent().hide(); | |
| 1257 | + try { | |
| 1258 | + let response = await fetch('../reject-consent'); | |
| 1259 | + if (!response) { | |
| 1260 | + throw new Error('Network response was not ok') | |
| 1261 | + } | |
| 1262 | + } | |
| 1263 | + catch (error) { | |
| 1264 | + console.log("There was a problem with fetch operation", error) | |
| 1265 | + } | |
| 1266 | + location.reload(); | |
| 1267 | + }); | |
| 1268 | + </script> | |
| 1269 | + | |
| 1270 | + | |
| 1271 | + | |
| 1272 | + <style> | |
| 1273 | + #consent-popup { | |
| 1274 | + position: sticky; | |
| 1275 | + width: 100%; | |
| 1276 | + background: #2A36A9; | |
| 1277 | + bottom: 0; | |
| 1278 | + left: 0; | |
| 1279 | + padding: 20px; | |
| 1280 | + z-index: 2; | |
| 1281 | + .titleText | |
| 1282 | + | |
| 1283 | + { | |
| 1284 | + font-size: 18px; | |
| 1285 | + text-align: center; | |
| 1286 | + color: #fff; | |
| 1287 | + margin-bottom: 0.5rem; | |
| 1288 | + } | |
| 1289 | + | |
| 1290 | + .contentText { | |
| 1291 | + text-align: center; | |
| 1292 | + color: white; | |
| 1293 | + max-width: 1200px; | |
| 1294 | + margin: 0 auto; | |
| 1295 | + p, a | |
| 1296 | + | |
| 1297 | + { | |
| 1298 | + color: white; | |
| 1299 | + margin-bottom: 15px; | |
| 1300 | + &:last-child | |
| 1301 | + | |
| 1302 | + { | |
| 1303 | + margin-bottom: 0px; | |
| 1304 | + } | |
| 1305 | + | |
| 1306 | + } | |
| 1307 | + } | |
| 1308 | + | |
| 1309 | + .button-row { | |
| 1310 | + margin-top: 1.2rem; | |
| 1311 | + display: flex; | |
| 1312 | + justify-content: center; | |
| 1313 | + .button-consent | |
| 1314 | + | |
| 1315 | + { | |
| 1316 | + margin-right: 30px; | |
| 1317 | + &:last-child | |
| 1318 | + | |
| 1319 | + { | |
| 1320 | + margin-right: 0px; | |
| 1321 | + } | |
| 1322 | + | |
| 1323 | + } | |
| 1324 | + | |
| 1325 | + .button--secondary { | |
| 1326 | + background:; | |
| 1327 | + border: 1px solid; | |
| 1328 | + } | |
| 1329 | + | |
| 1330 | + } | |
| 1331 | + } | |
| 1332 | + | |
| 1333 | + #consent-popup-content { | |
| 1334 | + color: white; | |
| 1335 | + font-size: 16px; | |
| 1336 | + } | |
| 1337 | + | |
| 1338 | + #consent-popup-content-container { | |
| 1339 | + text-align: center; | |
| 1340 | + max-width: 1200px; | |
| 1341 | + margin: 0 auto; | |
| 1342 | + } | |
| 1343 | + | |
| 1344 | + #privacy-link { | |
| 1345 | + text-decoration: underline; | |
| 1346 | + color: #fff; | |
| 1347 | + } | |
| 1348 | + | |
| 1349 | + .btn-margin-right { | |
| 1350 | + margin-right: 30px; | |
| 1351 | + } | |
| 1352 | + | |
| 1353 | + #accept-consent, #reject-consent { | |
| 1354 | + background-color: #EFF2F5; | |
| 1355 | + padding: 0.7rem 1.5rem; | |
| 1356 | + border-radius: 3px; | |
| 1357 | + letter-spacing: 0.02em; | |
| 1358 | + color: #1D2675; | |
| 1359 | + overflow: hidden; | |
| 1360 | + position: relative; | |
| 1361 | + display: inline-block; | |
| 1362 | + text-align: center; | |
| 1363 | + vertical-align: middle; | |
| 1364 | + user-select: none; | |
| 1365 | + border: 1px solid transparent; | |
| 1366 | + line-height: 1.5; | |
| 1367 | + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; | |
| 1368 | + } | |
| 1369 | + | |
| 1370 | + .footer-links-bottom-right { | |
| 1371 | + float: right; | |
| 1372 | + text-align: right; | |
| 1373 | + } | |
| 1374 | + </style> | |
| 1375 | +<script type="text/javascript" src="/_Incapsula_Resource?SWJIYLWA=719d34d31c8e3a6e6fffd425f7e032f3&ns=10&cb=1205200974" async></script></body> | |
| 1376 | +</html> | |
added
tests/fixtures/mortgage/national-bank.html
+11449 −0
@@ -0,0 +1,12197 @@ | ||
| 1 | +hares\",\"url\":\"https://www.nbc.ca/about-us/investors/capital-debt/shares.html\",\"current\":false},{\"label\":\"Legislative covered bonds\",\"url\":\"https://www.nbc.ca/about-us/investors/capital-debt/legislative-covered-bonds.html\",\"current\":false}]}]},{\"label\":\"News and communications\\t\\t\\t\",\"url\":\"https://www.nbc.ca/about-us/news-media.html\",\"current\":false,\"sections\":[{\"label\":\"PRESS RELEASES\",\"url\":\"\",\"current\":false,\"links\":[{\"label\":\"Latest news\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release.html\",\"current\":false},{\"label\":\"Archives 2025\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2025.html\",\"current\":false},{\"label\":\"Archives 2024\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2024.html\",\"current\":false},{\"label\":\"Archives 2023\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2023.html\",\"current\":false},{\"label\":\"Archives 2022\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2022.html\",\"current\":false},{\"label\":\"Archives 2021\",\"url\":\"https://www.nbc.ca/about-us/news-media/press-release/2021.html\",\"current\":false}]},{\"label\":\"FINANCIAL NEWS\",\"url\":\"\",\"current\":false,\"links\":[{\"label\":\"Financial news\",\"url\":\"https://www.nbc.ca/about-us/news-media/financial-news.html\",\"current\":false},{\"label\":\"Economical impact\",\"url\":\"https://www.nbc.ca/personal/advice/economic-impact.html\",\"current\":false},{\"label\":\"Financial analysis\",\"url\":\"https://www.nbc.ca/about-us/news-media/financial-news/financial-analysis.html\",\"current\":false}]}]},{\"label\":\"Careers\\t\\t\",\"url\":\"https://www.nbc.ca/tools-apps/career.html\",\"current\":false,\"sections\":[{\"label\":\" \",\"url\":\"\",\"current\":false,\"links\":[{\"label\":\"Life at National Bank\",\"url\":\"https://www.nbc.ca/tools-apps/career/life-national-bank.html\",\"current\":false},{\"label\":\"All Jobs\",\"url\":\"https://www.nbc.ca/tools-apps/career/all-jobs.html\",\"current\":false},{\"label\":\"Students and Internships\",\"url\":\"https://www.nbc.ca/tools-apps/career/students-internships.html\",\"current\":false}]}]}]}]}","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.react.NavigationMenu.isSecure()":"false","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.react.NavigationMenu.getSecureUrl()":"https://www.nbc.ca/personal/mortgages/rates.html/secure","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.LanguageSwitcher.getLanguageTwoCharName()":"Fr","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.LanguageSwitcher.getCurrentEncodedPagePath()":"5f42a34d6054412cfde38ac6c89caeafe0f5ea3453a3cf05c6beb01e865d6b0cbe4a70c0c4c1deeab76bb6d03abc697af77526d5b3f11211c2b59dca812f00a10eb376b9b5acac44aa49b6afbda9668a","/content/bnc/en/jcr:content/navigation-menu_com.bnc.aem.websites.toolkit.sling.models.LanguageSwitcher.getLanguageFirstLetterCapitalized()":"Français"}},"resourceType":"web-sites-react/components/navigation-menu","path":"/content/bnc/en/jcr:content/navigation-menu","wcmmode":"disabled"}</script><script src="/etc.clientlibs/web-sites-toolkit/clientlibs/web-sites-toolkit/toolkit-clientlib/clientlibs/vendor/lodash.min.a98e817fa80e9f0446305f835cdaa621.js"></script> | |
| 2 | +<script src="/etc.clientlibs/web-sites/clientlibs/vendor/react.min.45e0671f00ea10ecf34e891cd69b1f90.js"></script> | |
| 3 | +<script src="/etc.clientlibs/web-sites-react/components/web-sites-react/clientlib.min.fe11aea912e2dd12fabdd3005a3b27d5.js"></script> | |
| 4 | +<script src="/etc.clientlibs/web-sites/clientlibs/core/eventListenerHandlers.min.6da5ec95ff88986fe5a678195fb73f2e.js"></script> | |
| 5 | +<script src="/etc.clientlibs/web-sites/clientlibs/core/basepage.min.3097d244e3acdaa1cc46cbe27a844341.js"></script> | |
| 6 | +<script src="/etc.clientlibs/web-sites/clientlibs/core/sticky.min.f7421d1f70d92b9a74fb9655256bba54.js"></script> | |
| 7 | +<script src="/etc.clientlibs/web-sites-react/components/navigation-menu/clientlib.min.b4b22ad67a81f751655f944101a7ede1.js"></script> | |
| 8 | + | |
| 9 | + </div> | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + <main> | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | +<!-- on affiche le breadcrumb au besoin --> | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | +<!-- on affiche pas le titre au besoin --> | |
| 26 | + | |
| 27 | + | |
| 28 | +<div class="container-fluid"> | |
| 29 | + <div class="parsys"><div class="plainhtmlcode section"> | |
| 30 | +<div data-emptytext="HTML Component" class="cq-placeholder"></div> | |
| 31 | +<style>:target:before { | |
| 32 | + content: ""; | |
| 33 | + display: block; | |
| 34 | + height: 57px; | |
| 35 | + margin-top: -40px; | |
| 36 | +}</style> | |
| 37 | +</div> | |
| 38 | +<div class="capsuleProductsProvider section"> | |
| 39 | + | |
| 40 | + | |
| 41 | +<script src="/etc.clientlibs/web-sites/components/product/capsuleProductsProvider/clientlibs/site.min.5c88cf4ad66fd778797b7943e97fc6ab.js"></script> | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + <script> | |
| 51 | + // All arrays are centralized inside this object | |
| 52 | + // It contains capsule aliases arrays | |
| 53 | + // or the only array coming from the Products Provider Component | |
| 54 | + Websites.Product.Core.setProductMap(JSON.parse("{\x22c1\x22:\x22[{\\\x22taux7ansF\\\x22:\\\x226.400\\\x22,\\\x22tauxPromo4ansF\\\x22:\\\x224,79\\\x22,\\\x22tauxPromo3ansFQ\\\x22:\\\x224,64\\\x22,\\\x22productName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22tac3ans\\\x22:\\\x224,69\\\x22,\\\x22productName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22tauxPromo3ansF\\\x22:\\\x224.64\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22PH\u002DTF\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22tauxDateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22productTypeCd\\\x22:\\\x22MORTGLOAN\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productId\\\x22:\\\x22PH\u002DPRETHYP\\\x22,\\\x22taux1anF\\\x22:\\\x225.490\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tac4ans\\\x22:\\\x224,83\\\x22,\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Mortgage fixed rate\\\x22,\\\x22taux6moisF\\\x22:\\\x226.090\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22taux3moisF\\\x22:\\\x227.840\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22tauxPromo4ansFQ\\\x22:\\\x224,79\\\x22,\\\x22tauxPromo5ansF\\\x22:\\\x224,84\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22tac4ansQ\\\x22:\\\x224,83\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22taux6moisO\\\x22:\\\x229.750\\\x22,\\\x22tac3ansQ\\\x22:\\\x224,69\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22taux2ansIA\\\x22:\\\x22\\\x22,\\\x22taux5ansIA\\\x22:\\\x22\\\x22,\\\x22taux12moisIA\\\x22:\\\x22\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Prêt hypothécaire taux fixe\\\x22,\\\x22tac5ans\\\x22:\\\x224,88\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22taux2ansF\\\x22:\\\x225.240\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22tac5ansQ\\\x22:\\\x224,88\\\x22,\\\x22productConditionId\\\x22:\\\x22PH\u002DTF\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22taux4ansIA\\\x22:\\\x22\\\x22,\\\x22taux3ansF\\\x22:\\\x226.050\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/hypotheque\/PH\u002DPRETHYP\/OFFRE\u002DGEN\/PH\u002DTF\\\x22,\\\x22productName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22taux4ansF\\\x22:\\\x225.990\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Mortgage fixed rate\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x22Mortgage fixed rate\\\x22,\\\x22taux1anO\\\x22:\\\x229.650\\\x22,\\\x22tauxPromo5ansFQ\\\x22:\\\x224,84\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux1moisF\\\x22:\\\x224.450\\\x22,\\\x22taux3ansIA\\\x22:\\\x22\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22taux5ansF\\\x22:\\\x226.090\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22taux10ansF\\\x22:\\\x226.800\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22taux6ansF\\\x22:\\\x226.400\\\x22},{\\\x22productName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22PH\u002DTV\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22tauxDateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22productTypeCd\\\x22:\\\x22MORTGLOAN\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productId\\\x22:\\\x22PH\u002DPRETHYP\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Mortgage variable rate\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22tauxPromo5ansF\\\x22:\\\x224,10\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22ecart\\\x22:\\\x220\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22taux2ansIA\\\x22:\\\x22\\\x22,\\\x22taux5ansIA\\\x22:\\\x22\\\x22,\\\x22taux12moisIA\\\x22:\\\x22\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Prêt hypothécaire taux variable\\\x22,\\\x22tac5ans\\\x22:\\\x224,14\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22tac5ansQ\\\x22:\\\x224,14\\\x22,\\\x22productConditionId\\\x22:\\\x22PH\u002DTV\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22taux4ansIA\\\x22:\\\x22\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/hypotheque\/PH\u002DPRETHYP\/OFFRE\u002DGEN\/PH\u002DTV\\\x22,\\\x22productName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Mortgage variable rate\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x22Mortgage variable rate\\\x22,\\\x22tauxPromo5ansFQ\\\x22:\\\x224,10\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux5ansO\\\x22:\\\x224.450\\\x22,\\\x22taux3ansIA\\\x22:\\\x22\\\x22,\\\x22tauxBase\\\x22:\\\x220,35\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22},{\\\x22productName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Prêt Hypothécaire\\\x22,\\\x22productName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22PH\u002DTV\u002DPL\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22tauxDateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22productTypeCd\\\x22:\\\x22MORTGLOAN\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22productId\\\x22:\\\x22PH\u002DPRETHYP\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Variable capped\u002Drate mortgage\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22ecart\\\x22:\\\x220.250\\\x22,\\\x22tauxPlafond\\\x22:\\\x225.450\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22taux2ansIA\\\x22:\\\x22\\\x22,\\\x22taux5ansIA\\\x22:\\\x22\\\x22,\\\x22taux12moisIA\\\x22:\\\x22\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Prêt hypothécaire taux variable plafonné\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22PH\u002DTV\u002DPL\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22taux4ansIA\\\x22:\\\x22\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/hypotheque\/PH\u002DPRETHYP\/OFFRE\u002DGEN\/PH\u002DTV\u002DPL\\\x22,\\\x22productName.en\\\x22:\\\x22Mortgage Solutions\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Variable capped\u002Drate mortgage\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x22Variable capped\u002Drate mortgage\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux5ansO\\\x22:\\\x224.700\\\x22,\\\x22taux3ansIA\\\x22:\\\x22\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22}]\x22,\x22c2\x22:\x22[{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22MCP\u002DETUDNT\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x221000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22tauxAutre\\\x22:\\\x228.200\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Student Line of Credit \\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22ecart\\\x22:\\\x221.000 \\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x220\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Fonds de roulement étudiant\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DETUDNT\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DETUDNT\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22true\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/OFFRE\u002DGEN\/MCP\u002DETUDNT\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Student Line of Credit \\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DETUDNT\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x225.450 \\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22ecartAutre\\\x22:\\\x222.750 \\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22packageTypeCd\\\x22:\\\x22DEFAULT\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22MCP\u002DREER\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22RRSP Line of credit \\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22ecart\\\x22:\\\x221.000\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x220\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Marge REER\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREER\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREER\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22true\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/OFFRE\u002DGEN\/MCP\u002DREER\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22RRSP Line of credit \\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREER\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x225.450\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22packageTypeCd\\\x22:\\\x22DEFAULT\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000131\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22true\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22conditionId\\\x22:\\\x22MCP\u002DRENO\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.AMTRANGE.criteriaLowerValue\\\x22:\\\x225000\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.unitOfMsrCd\\\x22:\\\x22AMT\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productCriteria.AMTRANGE.lowerComparisonCd\\\x22:\\\x22GE\\\x22,\\\x22productConditionName\\\x22:\\\x22Home improvement loc\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22ecart\\\x22:\\\x223.000\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x220\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Marge de crédit rénovation\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DRENO\\\x22,\\\x22packageName.en\\\x22:\\\x22NBC general offer\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DRENO\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22true\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/OFFRE\u002DGEN\/MCP\u002DRENO\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22packageName\\\x22:\\\x22NBC general offer\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Home improvement loc\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DRENO\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x227.450\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22OFFRE\u002DGEN\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Offre BNC générale\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22true\\\x22,\\\x22packageTypeCd\\\x22:\\\x22DEFAULT\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productConditionName\\\x22:\\\x22Default\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22VIRTUOSE\\\x22,\\\x22ecart\\\x22:\\\x227.000\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x220\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Défaut\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22packageName.en\\\x22:\\\x22Virtuoso\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22false\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/VIRTUOSE\/MCP\u002DREG\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22VIRTUOSE\\\x22,\\\x22packageName\\\x22:\\\x22Virtuoso\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Default\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x2211.450\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22VIRTUOSE\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Virtuose\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22false\\\x22,\\\x22packageTypeCd\\\x22:\\\x22PACKAGE\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22},{\\\x22interetCredT5\\\x22:\\\x220.010\\\x22,\\\x22interetCredT3\\\x22:\\\x220.010\\\x22,\\\x22interetCredT4\\\x22:\\\x220.010\\\x22,\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22interetCredT1\\\x22:\\\x220.000\\\x22,\\\x22interetCredT2\\\x22:\\\x220.010\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22sciencesSante\\\x22:\\\x224,95\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22infirmier\\\x22:\\\x224,95\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productConditionName\\\x22:\\\x22Default\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22MCP\u002DTEU\\\x22,\\\x22ecart\\\x22:\\\x221.000\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x227500164\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Défaut\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22packageName.en\\\x22:\\\x22All\u002Din\u002DOne Account\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22false\\\x22,\\\x22ingenieur\\\x22:\\\x224,70\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22sante\\\x22:\\\x224,45\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/MCP\u002DTEU\/MCP\u002DREG\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22MCP\u002DTEU\\\x22,\\\x22packageName\\\x22:\\\x22All\u002Din\u002DOne Account\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Default\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22taux\\\x22:\\\x225.450\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22MCP\u002DTEU\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Tout\u002DEn\u002DUn\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22false\\\x22,\\\x22packageTypeCd\\\x22:\\\x22PROGRAM\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22,\\\x22liberal\\\x22:\\\x224 ,70\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22tauxAutre\\\x22:\\\x225.450\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22sciencesSante\\\x22:\\\x225,20\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22infirmier\\\x22:\\\x225,20\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productConditionName\\\x22:\\\x22Default\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22MCP\u002DMA\u002DPER\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x227500156\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Défaut\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22packageName.en\\\x22:\\\x22Personal Line of Credit\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22false\\\x22,\\\x22ingenieur\\\x22:\\\x224,70\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22sante\\\x22:\\\x224,45\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/MCP\u002DMA\u002DPER\/MCP\u002DREG\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22MCP\u002DMA\u002DPER\\\x22,\\\x22packageName\\\x22:\\\x22Personal Line of Credit\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Default\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22MCP\u002DMA\u002DPER\\\x22,\\\x22ecartAutre\\\x22:\\\x221.000\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Marge manœuvre personnelle\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22false\\\x22,\\\x22packageTypeCd\\\x22:\\\x22PROGRAM\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22,\\\x22liberal\\\x22:\\\x224,70\\\x22},{\\\x22legacyProductMapping.legacyProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22legacyProductMapping.SBIPProductSrcKey\\\x22:\\\x227000130\\\x22,\\\x22productCriteria.AMTRANGE\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_pfe\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyChannelVisibility\\\x22:\\\x22PUBLIC\\\x22,\\\x22productAbbrvName.fr\\\x22:\\\x22Marge de crédit\\\x22,\\\x22productName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.FNDSERIEF\\\x22:\\\x22false\\\x22,\\\x22productCriteria.FNDSERIEE\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEndDt\\\x22:\\\x222958465\\\x22,\\\x22productId.en\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CURRENCY\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQMODEL\\\x22:\\\x22false\\\x22,\\\x22productMarketLaunchDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22productTypeCd\\\x22:\\\x22LOC\\\x22,\\\x22productAbbrvName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22productId\\\x22:\\\x22MCP\\\x22,\\\x22dateJour\\\x22:\\\x222026\u002D08\u002D24T16:00:22.482\u002D04:00\\\x22,\\\x22channel.mobile\\\x22:\\\x22false\\\x22,\\\x22additionalCharacteristics\\\x22:[],\\\x22tags\\\x22:[],\\\x22productCriteria.MAGFI\\\x22:\\\x22false\\\x22,\\\x22productConditionName\\\x22:\\\x22Default\\\x22,\\\x22channel.vsd_res\\\x22:\\\x22false\\\x22,\\\x22productCriteria.PSYSINVEST\\\x22:\\\x22false\\\x22,\\\x22channel.sbip\\\x22:\\\x22false\\\x22,\\\x22productCriteria.INTTYPE\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQTYPE\\\x22:\\\x22false\\\x22,\\\x22packageId.fr\\\x22:\\\x22MCP\u002DHYP\\\x22,\\\x22channel.ddh\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCdOld\\\x22:\\\x22025\\\x22,\\\x22channel.succ\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyPackageSrcKey\\\x22:\\\x227500128\\\x22,\\\x22productCriteria.CHQCMDMSG\\\x22:\\\x22false\\\x22,\\\x22productConditionName.fr\\\x22:\\\x22Défaut\\\x22,\\\x22productConditionId.en\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22packageName.en\\\x22:\\\x22Home Equity Line of Credit\\\x22,\\\x22productDomainCd\\\x22:\\\x22LOAN\\\x22,\\\x22productCriteria.AGAMI\\\x22:\\\x22false\\\x22,\\\x22productConditionId\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_bnc\\\x22:\\\x22false\\\x22,\\\x22channel.vsd_cons\\\x22:\\\x22false\\\x22,\\\x22productAbbrvName\\\x22:\\\x22Line of credit \\\x22,\\\x22productCriteria.CHQNBR\\\x22:\\\x22false\\\x22,\\\x22channel.s_1859_inv\\\x22:\\\x22false\\\x22,\\\x22productPackageRltnpEffctvDt\\\x22:\\\x221900\u002D01\u002D01\\\x22,\\\x22puid\\\x22:\\\x22\/content\/productcatalog\/marge\/MCP\/MCP\u002DHYP\/MCP\u002DREG\\\x22,\\\x22productName.en\\\x22:\\\x22Line of credit \\\x22,\\\x22packageId.en\\\x22:\\\x22MCP\u002DHYP\\\x22,\\\x22packageName\\\x22:\\\x22Home Equity Line of Credit\\\x22,\\\x22productConditionName.en\\\x22:\\\x22Default\\\x22,\\\x22productConditionEffctvDt\\\x22:\\\x221\\\x22,\\\x22productCriteria.TERMRANGE\\\x22:\\\x22false\\\x22,\\\x22productConditionEndDt\\\x22:\\\x222958465\\\x22,\\\x22productConditionId.fr\\\x22:\\\x22MCP\u002DREG\\\x22,\\\x22channel.s_cns_fbn\\\x22:\\\x22false\\\x22,\\\x22tauxBase\\\x22:\\\x224.450\\\x22,\\\x22packageId\\\x22:\\\x22MCP\u002DHYP\\\x22,\\\x22channel.partnr\\\x22:\\\x22false\\\x22,\\\x22productCriteria.REGPLANTP\\\x22:\\\x22false\\\x22,\\\x22productId.fr\\\x22:\\\x22MCP\\\x22,\\\x22productCriteria.CHQCARTP\\\x22:\\\x22false\\\x22,\\\x22packageName.fr\\\x22:\\\x22Marge de crédit hypothécaire\\\x22,\\\x22channel.s_cns_1859\\\x22:\\\x22false\\\x22,\\\x22productCriteria.WEBINFOCD\\\x22:\\\x22false\\\x22,\\\x22productCriteria.ADDINVEST\\\x22:\\\x22false\\\x22,\\\x22productCriteria.CHQFORMAT\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.productLegacyLifeCycleCd\\\x22:\\\x22OFFERT\\\x22,\\\x22channel.internet\\\x22:\\\x22false\\\x22,\\\x22packageTypeCd\\\x22:\\\x22PROGRAM\\\x22,\\\x22productCriteria.IA\\\x22:\\\x22false\\\x22,\\\x22legacyProductMapping.legacyProductSrcCd\\\x22:\\\x220025\\\x22}]\x22}"), true); | |
| 55 | + </script> | |
| 56 | + | |
| 57 | +</div> | |
| 58 | +<div class="textandimage parbase section"> | |
| 59 | + | |
| 60 | + | |
| 61 | +<script src="/etc.clientlibs/web-sites/clientlibs/core/textandimage.min.9c820de2cd8bf947380bedee97d56688.js"></script> | |
| 62 | + | |
| 63 | +<link rel="stylesheet" href="/etc.clientlibs/web-sites/clientlibs/core/lightbox.min.52a11ac88f03e7666b3215ec7235efb2.css" type="text/css"> | |
| 64 | +<script src="/etc.clientlibs/web-sites/clientlibs/core/lightbox.min.247e04eae056fe5567a1503aa2fe6b77.js"></script> | |
| 65 | + | |
| 66 | +<link rel="stylesheet" href="/etc.clientlibs/web-sites/clientlibs/core/modal.min.9457654facd5992c898d0b9d071341f8.css" type="text/css"> | |
| 67 | +<script src="/etc.clientlibs/web-sites/clientlibs/core/modal.min.ec1acb2c245793c9aca006b573a1c26e.js"></script> | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_textandimage" class="text-image-container bncr-banner bncr-banner-head" | |
| 80 | + data-text-image-container-right-left="false"> | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + <div class="row text-image-row" | |
| 91 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 92 | + | |
| 93 | + data-text-image-rowcontainer-bg-type-lg="image" | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + data-text-image-rowcontainer-style-lg="url('/content/dam/bnc/particuliers/ban/hypotheque/ban-taux-hypothecaires-2000x375.jpg')" | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + data-text-image-rowcontainer-height-lg="375" | |
| 107 | + data-text-image-rowcontainer-width-lg="2000" | |
| 108 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 109 | + | |
| 110 | + data-text-image-rowcontainer-bg-type-md="image" | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + data-text-image-rowcontainer-style-md="url('/content/dam/bnc/particuliers/ban/hypotheque/ban-taux-hypothecaires-1199x375.jpg')" | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + data-text-image-rowcontainer-height-md="375" | |
| 135 | + data-text-image-rowcontainer-width-md="1199" | |
| 136 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 137 | + | |
| 138 | + data-text-image-rowcontainer-bg-type-sm="image" | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + data-text-image-rowcontainer-style-sm="url('/content/dam/bnc/particuliers/ban/hypotheque/ban-taux-hypothecaires-991x323.jpg')" | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + data-text-image-rowcontainer-height-sm="323" | |
| 163 | + data-text-image-rowcontainer-width-sm="991" | |
| 164 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 165 | + | |
| 166 | + data-text-image-rowcontainer-bg-type-xs="image" | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + data-text-image-rowcontainer-style-xs="url('/content/dam/bnc/particuliers/ban/hypotheque/ban-taux-hypothecaires-767x716_.jpg')" | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + data-text-image-rowcontainer-height-xs="716" | |
| 191 | + data-text-image-rowcontainer-width-xs="767" | |
| 192 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 193 | + | |
| 194 | + <div class="col-xs-12 text-image-text-container " ><h1 class="h1variant3">Mortgage rates<br> | |
| 195 | +</h1> | |
| 196 | +<p class="chapeau3">See current rates<br> | |
| 197 | +</p> | |
| 198 | +<p class="chapeau3"><a href="https://app.bnc.ca/forms/mortgage/preauth?lang=en" class="btnRTE3 btn-arrow btn" target="_blank">Protect your rate</a></p> | |
| 199 | +<p class="chapeau3"><a href="https://retail.appointment.bnc.ca/service?category=mo&lang=en&utm_medium=BNCWEBCA&utm_source=14" class="link-underlined__darker" target="_blank" hrefnoextension="false">Make an appointment</a></p> | |
| 200 | +</div> | |
| 201 | + </div> | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + <script> | |
| 214 | + | |
| 215 | + (function(){ | |
| 216 | + | |
| 217 | + var dataLayerViewEventName = '' || ''; | |
| 218 | + var dataLayerViewLayerProperties = []; | |
| 219 | + var $el; | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + if(dataLayerViewEventName.trim().length) { | |
| 224 | + | |
| 225 | + var obj = { | |
| 226 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 227 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_textandimage" , | |
| 228 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 229 | + }; | |
| 230 | + | |
| 231 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 232 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 233 | + if(document.currentScript){ | |
| 234 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 235 | + } else { | |
| 236 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 237 | + var currentScript = scripts[scripts.length - 1]; | |
| 238 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 239 | + } | |
| 240 | + | |
| 241 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 242 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 243 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 244 | + | |
| 245 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 246 | + | |
| 247 | + } | |
| 248 | + | |
| 249 | + })(); | |
| 250 | + | |
| 251 | + </script> | |
| 252 | + | |
| 253 | +</div> | |
| 254 | + | |
| 255 | + <script> | |
| 256 | + | |
| 257 | + /** | |
| 258 | + * clickEventDownloadHandler() | |
| 259 | + * Is used to handle download image action selected as an opening mode | |
| 260 | + * | |
| 261 | + */ | |
| 262 | + | |
| 263 | + var firstDownload = true; | |
| 264 | + | |
| 265 | + function clickEventDownloadHandler() { | |
| 266 | + | |
| 267 | + var link = this; | |
| 268 | + var filename = link.dataset.linkpath; | |
| 269 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 270 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 271 | + | |
| 272 | + if (newFile) { | |
| 273 | + | |
| 274 | + if (firstDownload) { | |
| 275 | + firstDownload = false; | |
| 276 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 277 | + } else { | |
| 278 | + this.href = link.href; | |
| 279 | + } | |
| 280 | + | |
| 281 | + this.download = fn; | |
| 282 | + | |
| 283 | + } else { | |
| 284 | + this.download = fn + ".html"; | |
| 285 | + } | |
| 286 | + } | |
| 287 | + | |
| 288 | + </script></div> | |
| 289 | +<div class="panelContainer section"> | |
| 290 | + | |
| 291 | + | |
| 292 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + <div> | |
| 297 | + | |
| 298 | +<script src="/etc.clientlibs/web-sites/clientlibs/vendor/jquery/jquery-sticky-1-0-4.min.b245ebc9b251955a08c1cf747a222d10.js"></script> | |
| 299 | +<script src="/etc.clientlibs/web-sites/clientlibs/core/stickyBehavior.min.81a4b9df09c15476124998587316faed.js"></script> | |
| 300 | +<script src="/etc.clientlibs/web-sites-toolkit/core/wcm/components/genericPanel/v1/genericPanel/clientlibs/site.min.8bd3357c8782030bd34e3822ff5765c2.js"></script> | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | +<div class="panelContainer panelContainerStyle2 " | |
| 324 | + | |
| 325 | + | |
| 326 | + data-websites-component="/components/panelContainer.v1" | |
| 327 | + data-panel-container-lg-mg="" | |
| 328 | + data-panel-container-lg-pd="" | |
| 329 | + data-panel-container-lg-ht="" | |
| 330 | + data-panel-container-md-mg="" | |
| 331 | + data-panel-container-md-pd="" | |
| 332 | + data-panel-container-md-ht="" | |
| 333 | + data-panel-container-sm-mg="" | |
| 334 | + data-panel-container-sm-pd="" | |
| 335 | + data-panel-container-sm-ht="" | |
| 336 | + data-panel-container-xs-mg="" | |
| 337 | + data-panel-container-xs-pd="" | |
| 338 | + data-panel-container-xs-ht="" | |
| 339 | + data-panel-container-limit=""> | |
| 340 | + <div class="parsys"><div class="panelContainer section"> | |
| 341 | + | |
| 342 | + | |
| 343 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + <div> | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | +<div class="panelContainer " | |
| 372 | + | |
| 373 | + | |
| 374 | + data-websites-component="/components/panelContainer.v1" | |
| 375 | + data-panel-container-lg-mg="5% 0 5% 0" | |
| 376 | + data-panel-container-lg-pd="" | |
| 377 | + data-panel-container-lg-ht="" | |
| 378 | + data-panel-container-md-mg="5% 0 5% 0" | |
| 379 | + data-panel-container-md-pd="" | |
| 380 | + data-panel-container-md-ht="" | |
| 381 | + data-panel-container-sm-mg="5% 0 5% 0" | |
| 382 | + data-panel-container-sm-pd="" | |
| 383 | + data-panel-container-sm-ht="" | |
| 384 | + data-panel-container-xs-mg="5% 0 5% 0" | |
| 385 | + data-panel-container-xs-pd="" | |
| 386 | + data-panel-container-xs-ht="" | |
| 387 | + data-panel-container-limit=""> | |
| 388 | + <div class="parsys"><div class="panelContainer section"> | |
| 389 | + | |
| 390 | + | |
| 391 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + <div> | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | +<div class="panelContainer background-none " | |
| 420 | + | |
| 421 | + | |
| 422 | + data-websites-component="/components/panelContainer.v1" | |
| 423 | + data-panel-container-lg-mg="1% 20% 0 0" | |
| 424 | + data-panel-container-lg-pd="" | |
| 425 | + data-panel-container-lg-ht="" | |
| 426 | + data-panel-container-md-mg="1% 20% 0 0" | |
| 427 | + data-panel-container-md-pd="" | |
| 428 | + data-panel-container-md-ht="" | |
| 429 | + data-panel-container-sm-mg="1% 0 0 0" | |
| 430 | + data-panel-container-sm-pd="" | |
| 431 | + data-panel-container-sm-ht="" | |
| 432 | + data-panel-container-xs-mg="1% 0 0 0" | |
| 433 | + data-panel-container-xs-pd="" | |
| 434 | + data-panel-container-xs-ht="" | |
| 435 | + data-panel-container-limit=""> | |
| 436 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_1477154735_parsys_textandimage" class="text-image-container at-0155-switch-h2" | |
| 453 | + data-text-image-container-right-left="false"> | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + <div class="row text-image-row" | |
| 464 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 465 | + | |
| 466 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + data-text-image-rowcontainer-height-lg="0" | |
| 473 | + data-text-image-rowcontainer-width-lg="0" | |
| 474 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 475 | + | |
| 476 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + data-text-image-rowcontainer-height-md="0" | |
| 483 | + data-text-image-rowcontainer-width-md="0" | |
| 484 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 485 | + | |
| 486 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + data-text-image-rowcontainer-height-sm="0" | |
| 493 | + data-text-image-rowcontainer-width-sm="0" | |
| 494 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 495 | + | |
| 496 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + data-text-image-rowcontainer-height-xs="0" | |
| 503 | + data-text-image-rowcontainer-width-xs="0" | |
| 504 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 505 | + | |
| 506 | + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant1"><a id="promo"></a>Special offers on certain terms</h2> | |
| 507 | +</div> | |
| 508 | + </div> | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + <script> | |
| 521 | + | |
| 522 | + (function(){ | |
| 523 | + | |
| 524 | + var dataLayerViewEventName = '' || ''; | |
| 525 | + var dataLayerViewLayerProperties = []; | |
| 526 | + var $el; | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + if(dataLayerViewEventName.trim().length) { | |
| 531 | + | |
| 532 | + var obj = { | |
| 533 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 534 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_1477154735_parsys_textandimage" , | |
| 535 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 536 | + }; | |
| 537 | + | |
| 538 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 539 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 540 | + if(document.currentScript){ | |
| 541 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 542 | + } else { | |
| 543 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 544 | + var currentScript = scripts[scripts.length - 1]; | |
| 545 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 546 | + } | |
| 547 | + | |
| 548 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 549 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 550 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 551 | + | |
| 552 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 553 | + | |
| 554 | + } | |
| 555 | + | |
| 556 | + })(); | |
| 557 | + | |
| 558 | + </script> | |
| 559 | + | |
| 560 | +</div> | |
| 561 | + | |
| 562 | + <script> | |
| 563 | + | |
| 564 | + /** | |
| 565 | + * clickEventDownloadHandler() | |
| 566 | + * Is used to handle download image action selected as an opening mode | |
| 567 | + * | |
| 568 | + */ | |
| 569 | + | |
| 570 | + var firstDownload = true; | |
| 571 | + | |
| 572 | + function clickEventDownloadHandler() { | |
| 573 | + | |
| 574 | + var link = this; | |
| 575 | + var filename = link.dataset.linkpath; | |
| 576 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 577 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 578 | + | |
| 579 | + if (newFile) { | |
| 580 | + | |
| 581 | + if (firstDownload) { | |
| 582 | + firstDownload = false; | |
| 583 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 584 | + } else { | |
| 585 | + this.href = link.href; | |
| 586 | + } | |
| 587 | + | |
| 588 | + this.download = fn; | |
| 589 | + | |
| 590 | + } else { | |
| 591 | + this.download = fn + ".html"; | |
| 592 | + } | |
| 593 | + } | |
| 594 | + | |
| 595 | + </script></div> | |
| 596 | + | |
| 597 | +</div> | |
| 598 | + | |
| 599 | +</div> | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | +<!--/* Initialize Js */--> | |
| 604 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_1477154735"> | |
| 605 | + if(""){ | |
| 606 | + new Websites.Sticky({ | |
| 607 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_1477154735", | |
| 608 | + breakpoint: { | |
| 609 | + lg: { | |
| 610 | + to: "" | |
| 611 | + }, | |
| 612 | + md: { | |
| 613 | + to: "" | |
| 614 | + }, | |
| 615 | + sm: { | |
| 616 | + to: "", | |
| 617 | + }, | |
| 618 | + xs: { | |
| 619 | + to: "" | |
| 620 | + } | |
| 621 | + } | |
| 622 | + }); | |
| 623 | + } | |
| 624 | +</script> | |
| 625 | + | |
| 626 | +</div> | |
| 627 | +</div> | |
| 628 | +<div class="panelContainer section"> | |
| 629 | + | |
| 630 | + | |
| 631 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + <div> | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | +<div class="panelContainer " | |
| 660 | + | |
| 661 | + | |
| 662 | + data-websites-component="/components/panelContainer.v1" | |
| 663 | + data-panel-container-lg-mg="" | |
| 664 | + data-panel-container-lg-pd="" | |
| 665 | + data-panel-container-lg-ht="" | |
| 666 | + data-panel-container-md-mg="" | |
| 667 | + data-panel-container-md-pd="" | |
| 668 | + data-panel-container-md-ht="" | |
| 669 | + data-panel-container-sm-mg="" | |
| 670 | + data-panel-container-sm-pd="" | |
| 671 | + data-panel-container-sm-ht="" | |
| 672 | + data-panel-container-xs-mg="" | |
| 673 | + data-panel-container-xs-pd="" | |
| 674 | + data-panel-container-xs-ht="" | |
| 675 | + data-panel-container-limit=""> | |
| 676 | + <div class="parsys"><div class="columns parbase section"> | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | +<script src="/etc.clientlibs/web-sites/components/columns/clientlibs/site.min.105741b41766cc59fef14e6b39edcf68.js"></script> | |
| 681 | + | |
| 682 | +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div> | |
| 683 | + | |
| 684 | + | |
| 685 | + | |
| 686 | + | |
| 687 | + | |
| 688 | + | |
| 689 | + | |
| 690 | + | |
| 691 | + | |
| 692 | + | |
| 693 | + | |
| 694 | + | |
| 695 | + | |
| 696 | + <div style="" | |
| 697 | + class="columns-row row row-eq-height" | |
| 698 | + | |
| 699 | + data-style-lg="" data-height-lg="" | |
| 700 | + data-width-lg="" | |
| 701 | + data-background-color-lg="" | |
| 702 | + data-background-color-xs=""> | |
| 703 | + <div style="" | |
| 704 | + class="col-xs-12 col-sm-12 columns-title " | |
| 705 | + data-height="" data-width="" | |
| 706 | + data-style-xs="" data-height-xs="" | |
| 707 | + data-width-xs=""> | |
| 708 | + | |
| 709 | + </div> | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + <div class="col-xs-12 col-sm-4 column col-first "> | |
| 715 | + <div class="parsys1 parsys"><div class="panelContainer section"> | |
| 716 | + | |
| 717 | + | |
| 718 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + <div> | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
| 739 | + | |
| 740 | + | |
| 741 | + | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | +<div class="panelContainer panel-border panel-border-radius " | |
| 747 | + | |
| 748 | + | |
| 749 | + data-websites-component="/components/panelContainer.v1" | |
| 750 | + data-panel-container-lg-mg="" | |
| 751 | + data-panel-container-lg-pd="20px" | |
| 752 | + data-panel-container-lg-ht="" | |
| 753 | + data-panel-container-md-mg="" | |
| 754 | + data-panel-container-md-pd="20px" | |
| 755 | + data-panel-container-md-ht="" | |
| 756 | + data-panel-container-sm-mg="" | |
| 757 | + data-panel-container-sm-pd="20px" | |
| 758 | + data-panel-container-sm-ht="" | |
| 759 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 760 | + data-panel-container-xs-pd="20px" | |
| 761 | + data-panel-container-xs-ht="" | |
| 762 | + data-panel-container-limit=""> | |
| 763 | + <div class="parsys"><div class="panelContainer section"> | |
| 764 | + | |
| 765 | + | |
| 766 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 767 | + | |
| 768 | + | |
| 769 | + | |
| 770 | + <div> | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
| 791 | + | |
| 792 | + | |
| 793 | + | |
| 794 | +<div class="panelContainer background-tertiary-pinkPastel " | |
| 795 | + | |
| 796 | + | |
| 797 | + data-websites-component="/components/panelContainer.v1" | |
| 798 | + data-panel-container-lg-mg="0 30%" | |
| 799 | + data-panel-container-lg-pd="10px 0 0 0" | |
| 800 | + data-panel-container-lg-ht="" | |
| 801 | + data-panel-container-md-mg="0 20%" | |
| 802 | + data-panel-container-md-pd="10px 0 0 0" | |
| 803 | + data-panel-container-md-ht="" | |
| 804 | + data-panel-container-sm-mg="" | |
| 805 | + data-panel-container-sm-pd="10px 0 0 0" | |
| 806 | + data-panel-container-sm-ht="" | |
| 807 | + data-panel-container-xs-mg="0 30%" | |
| 808 | + data-panel-container-xs-pd="10px 0 0 0" | |
| 809 | + data-panel-container-xs-ht="" | |
| 810 | + data-panel-container-limit=""> | |
| 811 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 812 | + | |
| 813 | + | |
| 814 | + | |
| 815 | + | |
| 816 | + | |
| 817 | + | |
| 818 | + | |
| 819 | + | |
| 820 | + | |
| 821 | + | |
| 822 | + | |
| 823 | + | |
| 824 | + | |
| 825 | + | |
| 826 | + | |
| 827 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_1939379463_parsys_textandimage" class="text-image-container " | |
| 828 | + data-text-image-container-right-left="false"> | |
| 829 | + | |
| 830 | + | |
| 831 | + | |
| 832 | + | |
| 833 | + | |
| 834 | + | |
| 835 | + | |
| 836 | + | |
| 837 | + | |
| 838 | + <div class="row text-image-row" | |
| 839 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 840 | + | |
| 841 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
| 847 | + data-text-image-rowcontainer-height-lg="0" | |
| 848 | + data-text-image-rowcontainer-width-lg="0" | |
| 849 | + data-text-image-rowcontainer-class-lg="backgroundColor72BFC1--80" | |
| 850 | + | |
| 851 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 852 | + | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
| 856 | + | |
| 857 | + data-text-image-rowcontainer-height-md="0" | |
| 858 | + data-text-image-rowcontainer-width-md="0" | |
| 859 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 860 | + | |
| 861 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
| 866 | + | |
| 867 | + data-text-image-rowcontainer-height-sm="0" | |
| 868 | + data-text-image-rowcontainer-width-sm="0" | |
| 869 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 870 | + | |
| 871 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + data-text-image-rowcontainer-height-xs="0" | |
| 878 | + data-text-image-rowcontainer-width-xs="0" | |
| 879 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 880 | + | |
| 881 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><b>PROMOTION</b></p> | |
| 882 | +</div> | |
| 883 | + </div> | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + <script> | |
| 896 | + | |
| 897 | + (function(){ | |
| 898 | + | |
| 899 | + var dataLayerViewEventName = '' || ''; | |
| 900 | + var dataLayerViewLayerProperties = []; | |
| 901 | + var $el; | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + if(dataLayerViewEventName.trim().length) { | |
| 906 | + | |
| 907 | + var obj = { | |
| 908 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 909 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_1939379463_parsys_textandimage" , | |
| 910 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 911 | + }; | |
| 912 | + | |
| 913 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 914 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 915 | + if(document.currentScript){ | |
| 916 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 917 | + } else { | |
| 918 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 919 | + var currentScript = scripts[scripts.length - 1]; | |
| 920 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 921 | + } | |
| 922 | + | |
| 923 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 924 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 925 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 926 | + | |
| 927 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 928 | + | |
| 929 | + } | |
| 930 | + | |
| 931 | + })(); | |
| 932 | + | |
| 933 | + </script> | |
| 934 | + | |
| 935 | +</div> | |
| 936 | + | |
| 937 | + <script> | |
| 938 | + | |
| 939 | + /** | |
| 940 | + * clickEventDownloadHandler() | |
| 941 | + * Is used to handle download image action selected as an opening mode | |
| 942 | + * | |
| 943 | + */ | |
| 944 | + | |
| 945 | + var firstDownload = true; | |
| 946 | + | |
| 947 | + function clickEventDownloadHandler() { | |
| 948 | + | |
| 949 | + var link = this; | |
| 950 | + var filename = link.dataset.linkpath; | |
| 951 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 952 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 953 | + | |
| 954 | + if (newFile) { | |
| 955 | + | |
| 956 | + if (firstDownload) { | |
| 957 | + firstDownload = false; | |
| 958 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 959 | + } else { | |
| 960 | + this.href = link.href; | |
| 961 | + } | |
| 962 | + | |
| 963 | + this.download = fn; | |
| 964 | + | |
| 965 | + } else { | |
| 966 | + this.download = fn + ".html"; | |
| 967 | + } | |
| 968 | + } | |
| 969 | + | |
| 970 | + </script></div> | |
| 971 | + | |
| 972 | +</div> | |
| 973 | + | |
| 974 | +</div> | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | +<!--/* Initialize Js */--> | |
| 979 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer_1939379463"> | |
| 980 | + if(""){ | |
| 981 | + new Websites.Sticky({ | |
| 982 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer_1939379463", | |
| 983 | + breakpoint: { | |
| 984 | + lg: { | |
| 985 | + to: "none" | |
| 986 | + }, | |
| 987 | + md: { | |
| 988 | + to: "none" | |
| 989 | + }, | |
| 990 | + sm: { | |
| 991 | + to: "none", | |
| 992 | + }, | |
| 993 | + xs: { | |
| 994 | + to: "none" | |
| 995 | + } | |
| 996 | + } | |
| 997 | + }); | |
| 998 | + } | |
| 999 | +</script> | |
| 1000 | + | |
| 1001 | +</div> | |
| 1002 | +</div> | |
| 1003 | +<div class="panelContainer section"> | |
| 1004 | + | |
| 1005 | + | |
| 1006 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + <div> | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | +<div class="panelContainer " | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + data-websites-component="/components/panelContainer.v1" | |
| 1038 | + data-panel-container-lg-mg="20px" | |
| 1039 | + data-panel-container-lg-pd="" | |
| 1040 | + data-panel-container-lg-ht="" | |
| 1041 | + data-panel-container-md-mg="20px 0 0 0" | |
| 1042 | + data-panel-container-md-pd="" | |
| 1043 | + data-panel-container-md-ht="" | |
| 1044 | + data-panel-container-sm-mg="20px 0 0 0" | |
| 1045 | + data-panel-container-sm-pd="" | |
| 1046 | + data-panel-container-sm-ht="" | |
| 1047 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 1048 | + data-panel-container-xs-pd="" | |
| 1049 | + data-panel-container-xs-ht="" | |
| 1050 | + data-panel-container-limit=""> | |
| 1051 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 1068 | + data-text-image-container-right-left="false"> | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + | |
| 1074 | + | |
| 1075 | + | |
| 1076 | + | |
| 1077 | + | |
| 1078 | + <div class="row text-image-row" | |
| 1079 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 1080 | + | |
| 1081 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 1082 | + | |
| 1083 | + | |
| 1084 | + | |
| 1085 | + | |
| 1086 | + | |
| 1087 | + data-text-image-rowcontainer-height-lg="0" | |
| 1088 | + data-text-image-rowcontainer-width-lg="0" | |
| 1089 | + data-text-image-rowcontainer-class-lg="" | |
| 1090 | + | |
| 1091 | + data-text-image-rowcontainer-bg-type-md="" | |
| 1092 | + | |
| 1093 | + | |
| 1094 | + | |
| 1095 | + | |
| 1096 | + | |
| 1097 | + data-text-image-rowcontainer-height-md="0" | |
| 1098 | + data-text-image-rowcontainer-width-md="0" | |
| 1099 | + data-text-image-rowcontainer-class-md="" | |
| 1100 | + | |
| 1101 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 1102 | + | |
| 1103 | + | |
| 1104 | + | |
| 1105 | + | |
| 1106 | + | |
| 1107 | + data-text-image-rowcontainer-height-sm="0" | |
| 1108 | + data-text-image-rowcontainer-width-sm="0" | |
| 1109 | + data-text-image-rowcontainer-class-sm="" | |
| 1110 | + | |
| 1111 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 1112 | + | |
| 1113 | + | |
| 1114 | + | |
| 1115 | + | |
| 1116 | + | |
| 1117 | + data-text-image-rowcontainer-height-xs="0" | |
| 1118 | + data-text-image-rowcontainer-width-xs="0" | |
| 1119 | + data-text-image-rowcontainer-class-xs=""> | |
| 1120 | + | |
| 1121 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><b>5 year</b> fixed high ratio rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p> | |
| 1122 | +<p class="chapeau3" style="text-align: center;">4.69%</p> | |
| 1123 | +</div> | |
| 1124 | + </div> | |
| 1125 | + | |
| 1126 | + | |
| 1127 | + | |
| 1128 | + | |
| 1129 | + | |
| 1130 | + | |
| 1131 | + | |
| 1132 | + | |
| 1133 | + | |
| 1134 | + | |
| 1135 | + | |
| 1136 | + <script> | |
| 1137 | + | |
| 1138 | + (function(){ | |
| 1139 | + | |
| 1140 | + var dataLayerViewEventName = '' || ''; | |
| 1141 | + var dataLayerViewLayerProperties = []; | |
| 1142 | + var $el; | |
| 1143 | + | |
| 1144 | + | |
| 1145 | + | |
| 1146 | + if(dataLayerViewEventName.trim().length) { | |
| 1147 | + | |
| 1148 | + var obj = { | |
| 1149 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 1150 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_parsys_textandimage" , | |
| 1151 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 1152 | + }; | |
| 1153 | + | |
| 1154 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 1155 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 1156 | + if(document.currentScript){ | |
| 1157 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 1158 | + } else { | |
| 1159 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 1160 | + var currentScript = scripts[scripts.length - 1]; | |
| 1161 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 1162 | + } | |
| 1163 | + | |
| 1164 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 1165 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 1166 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 1167 | + | |
| 1168 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 1169 | + | |
| 1170 | + } | |
| 1171 | + | |
| 1172 | + })(); | |
| 1173 | + | |
| 1174 | + </script> | |
| 1175 | + | |
| 1176 | +</div> | |
| 1177 | + | |
| 1178 | + <script> | |
| 1179 | + | |
| 1180 | + /** | |
| 1181 | + * clickEventDownloadHandler() | |
| 1182 | + * Is used to handle download image action selected as an opening mode | |
| 1183 | + * | |
| 1184 | + */ | |
| 1185 | + | |
| 1186 | + var firstDownload = true; | |
| 1187 | + | |
| 1188 | + function clickEventDownloadHandler() { | |
| 1189 | + | |
| 1190 | + var link = this; | |
| 1191 | + var filename = link.dataset.linkpath; | |
| 1192 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 1193 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 1194 | + | |
| 1195 | + if (newFile) { | |
| 1196 | + | |
| 1197 | + if (firstDownload) { | |
| 1198 | + firstDownload = false; | |
| 1199 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 1200 | + } else { | |
| 1201 | + this.href = link.href; | |
| 1202 | + } | |
| 1203 | + | |
| 1204 | + this.download = fn; | |
| 1205 | + | |
| 1206 | + } else { | |
| 1207 | + this.download = fn + ".html"; | |
| 1208 | + } | |
| 1209 | + } | |
| 1210 | + | |
| 1211 | + </script></div> | |
| 1212 | + | |
| 1213 | +</div> | |
| 1214 | + | |
| 1215 | +</div> | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | +<!--/* Initialize Js */--> | |
| 1220 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer"> | |
| 1221 | + if(""){ | |
| 1222 | + new Websites.Sticky({ | |
| 1223 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer", | |
| 1224 | + breakpoint: { | |
| 1225 | + lg: { | |
| 1226 | + to: "none" | |
| 1227 | + }, | |
| 1228 | + md: { | |
| 1229 | + to: "none" | |
| 1230 | + }, | |
| 1231 | + sm: { | |
| 1232 | + to: "none", | |
| 1233 | + }, | |
| 1234 | + xs: { | |
| 1235 | + to: "none" | |
| 1236 | + } | |
| 1237 | + } | |
| 1238 | + }); | |
| 1239 | + } | |
| 1240 | +</script> | |
| 1241 | + | |
| 1242 | +</div> | |
| 1243 | +</div> | |
| 1244 | +<div class="separator section"> | |
| 1245 | + | |
| 1246 | + | |
| 1247 | +<link rel="stylesheet" href="/etc.clientlibs/web-sites-toolkit/components/content/separator/clientlibs/site.min.ed03f48a059181c11364a01ab436d822.css" type="text/css"> | |
| 1248 | + | |
| 1249 | + | |
| 1250 | + | |
| 1251 | + | |
| 1252 | +<div id="separator-20d8a56044" class="cmp-separator"> | |
| 1253 | + <hr class="cmp-separator__horizontal-rule"/> | |
| 1254 | +</div></div> | |
| 1255 | +<div class="panelContainer section"> | |
| 1256 | + | |
| 1257 | + | |
| 1258 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 1259 | + | |
| 1260 | + | |
| 1261 | + | |
| 1262 | + <div> | |
| 1263 | + | |
| 1264 | + | |
| 1265 | + | |
| 1266 | + | |
| 1267 | + | |
| 1268 | + | |
| 1269 | + | |
| 1270 | + | |
| 1271 | + | |
| 1272 | + | |
| 1273 | + | |
| 1274 | + | |
| 1275 | + | |
| 1276 | + | |
| 1277 | + | |
| 1278 | + | |
| 1279 | + | |
| 1280 | + | |
| 1281 | + | |
| 1282 | + | |
| 1283 | + | |
| 1284 | + | |
| 1285 | + | |
| 1286 | +<div class="panelContainer " | |
| 1287 | + | |
| 1288 | + | |
| 1289 | + data-websites-component="/components/panelContainer.v1" | |
| 1290 | + data-panel-container-lg-mg="20px" | |
| 1291 | + data-panel-container-lg-pd="" | |
| 1292 | + data-panel-container-lg-ht="" | |
| 1293 | + data-panel-container-md-mg="20px 0 0 0" | |
| 1294 | + data-panel-container-md-pd="" | |
| 1295 | + data-panel-container-md-ht="" | |
| 1296 | + data-panel-container-sm-mg="20px 0 0 0" | |
| 1297 | + data-panel-container-sm-pd="" | |
| 1298 | + data-panel-container-sm-ht="" | |
| 1299 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 1300 | + data-panel-container-xs-pd="" | |
| 1301 | + data-panel-container-xs-ht="" | |
| 1302 | + data-panel-container-limit=""> | |
| 1303 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 1304 | + | |
| 1305 | + | |
| 1306 | + | |
| 1307 | + | |
| 1308 | + | |
| 1309 | + | |
| 1310 | + | |
| 1311 | + | |
| 1312 | + | |
| 1313 | + | |
| 1314 | + | |
| 1315 | + | |
| 1316 | + | |
| 1317 | + | |
| 1318 | + | |
| 1319 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_1021323156_parsys_textandimage" class="text-image-container " | |
| 1320 | + data-text-image-container-right-left="false"> | |
| 1321 | + | |
| 1322 | + | |
| 1323 | + | |
| 1324 | + | |
| 1325 | + | |
| 1326 | + | |
| 1327 | + | |
| 1328 | + | |
| 1329 | + | |
| 1330 | + <div class="row text-image-row" | |
| 1331 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 1332 | + | |
| 1333 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 1334 | + | |
| 1335 | + | |
| 1336 | + | |
| 1337 | + | |
| 1338 | + | |
| 1339 | + data-text-image-rowcontainer-height-lg="0" | |
| 1340 | + data-text-image-rowcontainer-width-lg="0" | |
| 1341 | + data-text-image-rowcontainer-class-lg="" | |
| 1342 | + | |
| 1343 | + data-text-image-rowcontainer-bg-type-md="" | |
| 1344 | + | |
| 1345 | + | |
| 1346 | + | |
| 1347 | + | |
| 1348 | + | |
| 1349 | + data-text-image-rowcontainer-height-md="0" | |
| 1350 | + data-text-image-rowcontainer-width-md="0" | |
| 1351 | + data-text-image-rowcontainer-class-md="" | |
| 1352 | + | |
| 1353 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 1354 | + | |
| 1355 | + | |
| 1356 | + | |
| 1357 | + | |
| 1358 | + | |
| 1359 | + data-text-image-rowcontainer-height-sm="0" | |
| 1360 | + data-text-image-rowcontainer-width-sm="0" | |
| 1361 | + data-text-image-rowcontainer-class-sm="" | |
| 1362 | + | |
| 1363 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 1364 | + | |
| 1365 | + | |
| 1366 | + | |
| 1367 | + | |
| 1368 | + | |
| 1369 | + data-text-image-rowcontainer-height-xs="0" | |
| 1370 | + data-text-image-rowcontainer-width-xs="0" | |
| 1371 | + data-text-image-rowcontainer-class-xs=""> | |
| 1372 | + | |
| 1373 | + <div class="col-xs-12 text-image-text-container " ><p class="chapeau3" style="text-align: center;">4.73%<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p> | |
| 1374 | +<p style="text-align: center;">APR<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">2</a></sup></p> | |
| 1375 | +</div> | |
| 1376 | + </div> | |
| 1377 | + | |
| 1378 | + | |
| 1379 | + | |
| 1380 | + | |
| 1381 | + | |
| 1382 | + | |
| 1383 | + | |
| 1384 | + | |
| 1385 | + | |
| 1386 | + | |
| 1387 | + | |
| 1388 | + <script> | |
| 1389 | + | |
| 1390 | + (function(){ | |
| 1391 | + | |
| 1392 | + var dataLayerViewEventName = '' || ''; | |
| 1393 | + var dataLayerViewLayerProperties = []; | |
| 1394 | + var $el; | |
| 1395 | + | |
| 1396 | + | |
| 1397 | + | |
| 1398 | + if(dataLayerViewEventName.trim().length) { | |
| 1399 | + | |
| 1400 | + var obj = { | |
| 1401 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 1402 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys1_panelcontainer_copy_parsys_panelcontainer_1021323156_parsys_textandimage" , | |
| 1403 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 1404 | + }; | |
| 1405 | + | |
| 1406 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 1407 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 1408 | + if(document.currentScript){ | |
| 1409 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 1410 | + } else { | |
| 1411 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 1412 | + var currentScript = scripts[scripts.length - 1]; | |
| 1413 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 1414 | + } | |
| 1415 | + | |
| 1416 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 1417 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 1418 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 1419 | + | |
| 1420 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 1421 | + | |
| 1422 | + } | |
| 1423 | + | |
| 1424 | + })(); | |
| 1425 | + | |
| 1426 | + </script> | |
| 1427 | + | |
| 1428 | +</div> | |
| 1429 | + | |
| 1430 | + <script> | |
| 1431 | + | |
| 1432 | + /** | |
| 1433 | + * clickEventDownloadHandler() | |
| 1434 | + * Is used to handle download image action selected as an opening mode | |
| 1435 | + * | |
| 1436 | + */ | |
| 1437 | + | |
| 1438 | + var firstDownload = true; | |
| 1439 | + | |
| 1440 | + function clickEventDownloadHandler() { | |
| 1441 | + | |
| 1442 | + var link = this; | |
| 1443 | + var filename = link.dataset.linkpath; | |
| 1444 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 1445 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 1446 | + | |
| 1447 | + if (newFile) { | |
| 1448 | + | |
| 1449 | + if (firstDownload) { | |
| 1450 | + firstDownload = false; | |
| 1451 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 1452 | + } else { | |
| 1453 | + this.href = link.href; | |
| 1454 | + } | |
| 1455 | + | |
| 1456 | + this.download = fn; | |
| 1457 | + | |
| 1458 | + } else { | |
| 1459 | + this.download = fn + ".html"; | |
| 1460 | + } | |
| 1461 | + } | |
| 1462 | + | |
| 1463 | + </script></div> | |
| 1464 | + | |
| 1465 | +</div> | |
| 1466 | + | |
| 1467 | +</div> | |
| 1468 | + | |
| 1469 | + | |
| 1470 | + | |
| 1471 | +<!--/* Initialize Js */--> | |
| 1472 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer_1021323156"> | |
| 1473 | + if(""){ | |
| 1474 | + new Websites.Sticky({ | |
| 1475 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy/parsys/panelcontainer_1021323156", | |
| 1476 | + breakpoint: { | |
| 1477 | + lg: { | |
| 1478 | + to: "none" | |
| 1479 | + }, | |
| 1480 | + md: { | |
| 1481 | + to: "none" | |
| 1482 | + }, | |
| 1483 | + sm: { | |
| 1484 | + to: "none", | |
| 1485 | + }, | |
| 1486 | + xs: { | |
| 1487 | + to: "none" | |
| 1488 | + } | |
| 1489 | + } | |
| 1490 | + }); | |
| 1491 | + } | |
| 1492 | +</script> | |
| 1493 | + | |
| 1494 | +</div> | |
| 1495 | +</div> | |
| 1496 | + | |
| 1497 | +</div> | |
| 1498 | + | |
| 1499 | +</div> | |
| 1500 | + | |
| 1501 | + | |
| 1502 | + | |
| 1503 | +<!--/* Initialize Js */--> | |
| 1504 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy"> | |
| 1505 | + if(""){ | |
| 1506 | + new Websites.Sticky({ | |
| 1507 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys1/panelcontainer_copy", | |
| 1508 | + breakpoint: { | |
| 1509 | + lg: { | |
| 1510 | + to: "none" | |
| 1511 | + }, | |
| 1512 | + md: { | |
| 1513 | + to: "none" | |
| 1514 | + }, | |
| 1515 | + sm: { | |
| 1516 | + to: "none", | |
| 1517 | + }, | |
| 1518 | + xs: { | |
| 1519 | + to: "none" | |
| 1520 | + } | |
| 1521 | + } | |
| 1522 | + }); | |
| 1523 | + } | |
| 1524 | +</script> | |
| 1525 | + | |
| 1526 | +</div> | |
| 1527 | +</div> | |
| 1528 | + | |
| 1529 | +</div> | |
| 1530 | + | |
| 1531 | + </div> | |
| 1532 | + | |
| 1533 | + <div class="col-xs-12 col-sm-4 column "> | |
| 1534 | + <div class="parsys2 parsys"><div class="panelContainer section"> | |
| 1535 | + | |
| 1536 | + | |
| 1537 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 1538 | + | |
| 1539 | + | |
| 1540 | + | |
| 1541 | + <div> | |
| 1542 | + | |
| 1543 | + | |
| 1544 | + | |
| 1545 | + | |
| 1546 | + | |
| 1547 | + | |
| 1548 | + | |
| 1549 | + | |
| 1550 | + | |
| 1551 | + | |
| 1552 | + | |
| 1553 | + | |
| 1554 | + | |
| 1555 | + | |
| 1556 | + | |
| 1557 | + | |
| 1558 | + | |
| 1559 | + | |
| 1560 | + | |
| 1561 | + | |
| 1562 | + | |
| 1563 | + | |
| 1564 | + | |
| 1565 | +<div class="panelContainer panel-border panel-border-radius " | |
| 1566 | + | |
| 1567 | + | |
| 1568 | + data-websites-component="/components/panelContainer.v1" | |
| 1569 | + data-panel-container-lg-mg="0 10px" | |
| 1570 | + data-panel-container-lg-pd="20px" | |
| 1571 | + data-panel-container-lg-ht="" | |
| 1572 | + data-panel-container-md-mg="0 10px" | |
| 1573 | + data-panel-container-md-pd="20px" | |
| 1574 | + data-panel-container-md-ht="" | |
| 1575 | + data-panel-container-sm-mg="0 10px" | |
| 1576 | + data-panel-container-sm-pd="20px" | |
| 1577 | + data-panel-container-sm-ht="" | |
| 1578 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 1579 | + data-panel-container-xs-pd="20px" | |
| 1580 | + data-panel-container-xs-ht="" | |
| 1581 | + data-panel-container-limit=""> | |
| 1582 | + <div class="parsys"><div class="panelContainer section"> | |
| 1583 | + | |
| 1584 | + | |
| 1585 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 1586 | + | |
| 1587 | + | |
| 1588 | + | |
| 1589 | + <div> | |
| 1590 | + | |
| 1591 | + | |
| 1592 | + | |
| 1593 | + | |
| 1594 | + | |
| 1595 | + | |
| 1596 | + | |
| 1597 | + | |
| 1598 | + | |
| 1599 | + | |
| 1600 | + | |
| 1601 | + | |
| 1602 | + | |
| 1603 | + | |
| 1604 | + | |
| 1605 | + | |
| 1606 | + | |
| 1607 | + | |
| 1608 | + | |
| 1609 | + | |
| 1610 | + | |
| 1611 | + | |
| 1612 | + | |
| 1613 | +<div class="panelContainer background-tertiary-pinkPastel " | |
| 1614 | + | |
| 1615 | + | |
| 1616 | + data-websites-component="/components/panelContainer.v1" | |
| 1617 | + data-panel-container-lg-mg="0 30%" | |
| 1618 | + data-panel-container-lg-pd="10px 0 0 0" | |
| 1619 | + data-panel-container-lg-ht="" | |
| 1620 | + data-panel-container-md-mg="0 20%" | |
| 1621 | + data-panel-container-md-pd="10px 0 0 0" | |
| 1622 | + data-panel-container-md-ht="" | |
| 1623 | + data-panel-container-sm-mg="" | |
| 1624 | + data-panel-container-sm-pd="10px 0 0 0" | |
| 1625 | + data-panel-container-sm-ht="" | |
| 1626 | + data-panel-container-xs-mg="0 30%" | |
| 1627 | + data-panel-container-xs-pd="10px 0 0 0" | |
| 1628 | + data-panel-container-xs-ht="" | |
| 1629 | + data-panel-container-limit=""> | |
| 1630 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 1631 | + | |
| 1632 | + | |
| 1633 | + | |
| 1634 | + | |
| 1635 | + | |
| 1636 | + | |
| 1637 | + | |
| 1638 | + | |
| 1639 | + | |
| 1640 | + | |
| 1641 | + | |
| 1642 | + | |
| 1643 | + | |
| 1644 | + | |
| 1645 | + | |
| 1646 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_1939379463_parsys_textandimage" class="text-image-container " | |
| 1647 | + data-text-image-container-right-left="false"> | |
| 1648 | + | |
| 1649 | + | |
| 1650 | + | |
| 1651 | + | |
| 1652 | + | |
| 1653 | + | |
| 1654 | + | |
| 1655 | + | |
| 1656 | + | |
| 1657 | + <div class="row text-image-row" | |
| 1658 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 1659 | + | |
| 1660 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 1661 | + | |
| 1662 | + | |
| 1663 | + | |
| 1664 | + | |
| 1665 | + | |
| 1666 | + data-text-image-rowcontainer-height-lg="0" | |
| 1667 | + data-text-image-rowcontainer-width-lg="0" | |
| 1668 | + data-text-image-rowcontainer-class-lg="backgroundColor72BFC1--80" | |
| 1669 | + | |
| 1670 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 1671 | + | |
| 1672 | + | |
| 1673 | + | |
| 1674 | + | |
| 1675 | + | |
| 1676 | + data-text-image-rowcontainer-height-md="0" | |
| 1677 | + data-text-image-rowcontainer-width-md="0" | |
| 1678 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 1679 | + | |
| 1680 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 1681 | + | |
| 1682 | + | |
| 1683 | + | |
| 1684 | + | |
| 1685 | + | |
| 1686 | + data-text-image-rowcontainer-height-sm="0" | |
| 1687 | + data-text-image-rowcontainer-width-sm="0" | |
| 1688 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 1689 | + | |
| 1690 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 1691 | + | |
| 1692 | + | |
| 1693 | + | |
| 1694 | + | |
| 1695 | + | |
| 1696 | + data-text-image-rowcontainer-height-xs="0" | |
| 1697 | + data-text-image-rowcontainer-width-xs="0" | |
| 1698 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 1699 | + | |
| 1700 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><b>PROMOTION</b></p> | |
| 1701 | +</div> | |
| 1702 | + </div> | |
| 1703 | + | |
| 1704 | + | |
| 1705 | + | |
| 1706 | + | |
| 1707 | + | |
| 1708 | + | |
| 1709 | + | |
| 1710 | + | |
| 1711 | + | |
| 1712 | + | |
| 1713 | + | |
| 1714 | + <script> | |
| 1715 | + | |
| 1716 | + (function(){ | |
| 1717 | + | |
| 1718 | + var dataLayerViewEventName = '' || ''; | |
| 1719 | + var dataLayerViewLayerProperties = []; | |
| 1720 | + var $el; | |
| 1721 | + | |
| 1722 | + | |
| 1723 | + | |
| 1724 | + if(dataLayerViewEventName.trim().length) { | |
| 1725 | + | |
| 1726 | + var obj = { | |
| 1727 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 1728 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_1939379463_parsys_textandimage" , | |
| 1729 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 1730 | + }; | |
| 1731 | + | |
| 1732 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 1733 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 1734 | + if(document.currentScript){ | |
| 1735 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 1736 | + } else { | |
| 1737 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 1738 | + var currentScript = scripts[scripts.length - 1]; | |
| 1739 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 1740 | + } | |
| 1741 | + | |
| 1742 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 1743 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 1744 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 1745 | + | |
| 1746 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 1747 | + | |
| 1748 | + } | |
| 1749 | + | |
| 1750 | + })(); | |
| 1751 | + | |
| 1752 | + </script> | |
| 1753 | + | |
| 1754 | +</div> | |
| 1755 | + | |
| 1756 | + <script> | |
| 1757 | + | |
| 1758 | + /** | |
| 1759 | + * clickEventDownloadHandler() | |
| 1760 | + * Is used to handle download image action selected as an opening mode | |
| 1761 | + * | |
| 1762 | + */ | |
| 1763 | + | |
| 1764 | + var firstDownload = true; | |
| 1765 | + | |
| 1766 | + function clickEventDownloadHandler() { | |
| 1767 | + | |
| 1768 | + var link = this; | |
| 1769 | + var filename = link.dataset.linkpath; | |
| 1770 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 1771 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 1772 | + | |
| 1773 | + if (newFile) { | |
| 1774 | + | |
| 1775 | + if (firstDownload) { | |
| 1776 | + firstDownload = false; | |
| 1777 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 1778 | + } else { | |
| 1779 | + this.href = link.href; | |
| 1780 | + } | |
| 1781 | + | |
| 1782 | + this.download = fn; | |
| 1783 | + | |
| 1784 | + } else { | |
| 1785 | + this.download = fn + ".html"; | |
| 1786 | + } | |
| 1787 | + } | |
| 1788 | + | |
| 1789 | + </script></div> | |
| 1790 | + | |
| 1791 | +</div> | |
| 1792 | + | |
| 1793 | +</div> | |
| 1794 | + | |
| 1795 | + | |
| 1796 | + | |
| 1797 | +<!--/* Initialize Js */--> | |
| 1798 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer_1939379463"> | |
| 1799 | + if(""){ | |
| 1800 | + new Websites.Sticky({ | |
| 1801 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer_1939379463", | |
| 1802 | + breakpoint: { | |
| 1803 | + lg: { | |
| 1804 | + to: "none" | |
| 1805 | + }, | |
| 1806 | + md: { | |
| 1807 | + to: "none" | |
| 1808 | + }, | |
| 1809 | + sm: { | |
| 1810 | + to: "none", | |
| 1811 | + }, | |
| 1812 | + xs: { | |
| 1813 | + to: "none" | |
| 1814 | + } | |
| 1815 | + } | |
| 1816 | + }); | |
| 1817 | + } | |
| 1818 | +</script> | |
| 1819 | + | |
| 1820 | +</div> | |
| 1821 | +</div> | |
| 1822 | +<div class="panelContainer section"> | |
| 1823 | + | |
| 1824 | + | |
| 1825 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 1826 | + | |
| 1827 | + | |
| 1828 | + | |
| 1829 | + <div> | |
| 1830 | + | |
| 1831 | + | |
| 1832 | + | |
| 1833 | + | |
| 1834 | + | |
| 1835 | + | |
| 1836 | + | |
| 1837 | + | |
| 1838 | + | |
| 1839 | + | |
| 1840 | + | |
| 1841 | + | |
| 1842 | + | |
| 1843 | + | |
| 1844 | + | |
| 1845 | + | |
| 1846 | + | |
| 1847 | + | |
| 1848 | + | |
| 1849 | + | |
| 1850 | + | |
| 1851 | + | |
| 1852 | + | |
| 1853 | +<div class="panelContainer " | |
| 1854 | + | |
| 1855 | + | |
| 1856 | + data-websites-component="/components/panelContainer.v1" | |
| 1857 | + data-panel-container-lg-mg="20px" | |
| 1858 | + data-panel-container-lg-pd="" | |
| 1859 | + data-panel-container-lg-ht="" | |
| 1860 | + data-panel-container-md-mg="20px 0 0 0" | |
| 1861 | + data-panel-container-md-pd="" | |
| 1862 | + data-panel-container-md-ht="" | |
| 1863 | + data-panel-container-sm-mg="20px 0 0 0" | |
| 1864 | + data-panel-container-sm-pd="" | |
| 1865 | + data-panel-container-sm-ht="" | |
| 1866 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 1867 | + data-panel-container-xs-pd="" | |
| 1868 | + data-panel-container-xs-ht="" | |
| 1869 | + data-panel-container-limit=""> | |
| 1870 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 1871 | + | |
| 1872 | + | |
| 1873 | + | |
| 1874 | + | |
| 1875 | + | |
| 1876 | + | |
| 1877 | + | |
| 1878 | + | |
| 1879 | + | |
| 1880 | + | |
| 1881 | + | |
| 1882 | + | |
| 1883 | + | |
| 1884 | + | |
| 1885 | + | |
| 1886 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 1887 | + data-text-image-container-right-left="false"> | |
| 1888 | + | |
| 1889 | + | |
| 1890 | + | |
| 1891 | + | |
| 1892 | + | |
| 1893 | + | |
| 1894 | + | |
| 1895 | + | |
| 1896 | + | |
| 1897 | + <div class="row text-image-row" | |
| 1898 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 1899 | + | |
| 1900 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 1901 | + | |
| 1902 | + | |
| 1903 | + | |
| 1904 | + | |
| 1905 | + | |
| 1906 | + data-text-image-rowcontainer-height-lg="0" | |
| 1907 | + data-text-image-rowcontainer-width-lg="0" | |
| 1908 | + data-text-image-rowcontainer-class-lg="" | |
| 1909 | + | |
| 1910 | + data-text-image-rowcontainer-bg-type-md="" | |
| 1911 | + | |
| 1912 | + | |
| 1913 | + | |
| 1914 | + | |
| 1915 | + | |
| 1916 | + data-text-image-rowcontainer-height-md="0" | |
| 1917 | + data-text-image-rowcontainer-width-md="0" | |
| 1918 | + data-text-image-rowcontainer-class-md="" | |
| 1919 | + | |
| 1920 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 1921 | + | |
| 1922 | + | |
| 1923 | + | |
| 1924 | + | |
| 1925 | + | |
| 1926 | + data-text-image-rowcontainer-height-sm="0" | |
| 1927 | + data-text-image-rowcontainer-width-sm="0" | |
| 1928 | + data-text-image-rowcontainer-class-sm="" | |
| 1929 | + | |
| 1930 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 1931 | + | |
| 1932 | + | |
| 1933 | + | |
| 1934 | + | |
| 1935 | + | |
| 1936 | + data-text-image-rowcontainer-height-xs="0" | |
| 1937 | + data-text-image-rowcontainer-width-xs="0" | |
| 1938 | + data-text-image-rowcontainer-class-xs=""> | |
| 1939 | + | |
| 1940 | + <div class="col-xs-12 text-image-text-container | |
| 1941 | + initializing" ><p style="text-align: center;"><b>5 year</b> fixed rate<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">1</a></sup></p> | |
| 1942 | +<p class="chapeau3" style="text-align: center;"><span static-token='tauxPromo5ansF|percent:"true"'>${p1.tauxPromo5ansF|percent:"true"}</span><br> | |
| 1943 | +</p></div> | |
| 1944 | + </div> | |
| 1945 | + | |
| 1946 | + | |
| 1947 | + | |
| 1948 | + | |
| 1949 | + | |
| 1950 | + | |
| 1951 | + | |
| 1952 | + | |
| 1953 | + | |
| 1954 | + | |
| 1955 | + | |
| 1956 | + | |
| 1957 | + <script> | |
| 1958 | + (function(){ | |
| 1959 | + var $el; | |
| 1960 | + var listeners = []; | |
| 1961 | + var dataLayerViewEventName = ''; | |
| 1962 | + var dataLayerViewLayerProperties = []; | |
| 1963 | + | |
| 1964 | + dataLayerViewEventName = ''; | |
| 1965 | + | |
| 1966 | + | |
| 1967 | + | |
| 1968 | + | |
| 1969 | + | |
| 1970 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 1971 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 1972 | + if(document.currentScript){ | |
| 1973 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 1974 | + } else { | |
| 1975 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 1976 | + var currentScript = scripts[scripts.length - 1]; | |
| 1977 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 1978 | + } | |
| 1979 | + | |
| 1980 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 1981 | + Websites.Product.TextContent.initTextContent({ | |
| 1982 | + $el: $el, | |
| 1983 | + capsuleAlias: "", | |
| 1984 | + listeners: listeners, | |
| 1985 | + products: Websites.Product.Core.determineProductsArray(""), | |
| 1986 | + dataLayerViewEvent: { | |
| 1987 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 1988 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_parsys_textandimage" , | |
| 1989 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 1990 | + } | |
| 1991 | + }); | |
| 1992 | + }); | |
| 1993 | + })(); | |
| 1994 | + | |
| 1995 | + </script> | |
| 1996 | + | |
| 1997 | + | |
| 1998 | + | |
| 1999 | + | |
| 2000 | + | |
| 2001 | +</div> | |
| 2002 | + | |
| 2003 | + <script> | |
| 2004 | + | |
| 2005 | + /** | |
| 2006 | + * clickEventDownloadHandler() | |
| 2007 | + * Is used to handle download image action selected as an opening mode | |
| 2008 | + * | |
| 2009 | + */ | |
| 2010 | + | |
| 2011 | + var firstDownload = true; | |
| 2012 | + | |
| 2013 | + function clickEventDownloadHandler() { | |
| 2014 | + | |
| 2015 | + var link = this; | |
| 2016 | + var filename = link.dataset.linkpath; | |
| 2017 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 2018 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 2019 | + | |
| 2020 | + if (newFile) { | |
| 2021 | + | |
| 2022 | + if (firstDownload) { | |
| 2023 | + firstDownload = false; | |
| 2024 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 2025 | + } else { | |
| 2026 | + this.href = link.href; | |
| 2027 | + } | |
| 2028 | + | |
| 2029 | + this.download = fn; | |
| 2030 | + | |
| 2031 | + } else { | |
| 2032 | + this.download = fn + ".html"; | |
| 2033 | + } | |
| 2034 | + } | |
| 2035 | + | |
| 2036 | + </script></div> | |
| 2037 | + | |
| 2038 | +</div> | |
| 2039 | + | |
| 2040 | +</div> | |
| 2041 | + | |
| 2042 | + | |
| 2043 | + | |
| 2044 | +<!--/* Initialize Js */--> | |
| 2045 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer"> | |
| 2046 | + if(""){ | |
| 2047 | + new Websites.Sticky({ | |
| 2048 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer", | |
| 2049 | + breakpoint: { | |
| 2050 | + lg: { | |
| 2051 | + to: "none" | |
| 2052 | + }, | |
| 2053 | + md: { | |
| 2054 | + to: "none" | |
| 2055 | + }, | |
| 2056 | + sm: { | |
| 2057 | + to: "none", | |
| 2058 | + }, | |
| 2059 | + xs: { | |
| 2060 | + to: "none" | |
| 2061 | + } | |
| 2062 | + } | |
| 2063 | + }); | |
| 2064 | + } | |
| 2065 | +</script> | |
| 2066 | + | |
| 2067 | +</div> | |
| 2068 | +</div> | |
| 2069 | +<div class="separator section"> | |
| 2070 | + | |
| 2071 | + | |
| 2072 | + | |
| 2073 | + | |
| 2074 | + | |
| 2075 | + | |
| 2076 | +<div id="separator-eba8872247" class="cmp-separator"> | |
| 2077 | + <hr class="cmp-separator__horizontal-rule"/> | |
| 2078 | +</div></div> | |
| 2079 | +<div class="panelContainer section"> | |
| 2080 | + | |
| 2081 | + | |
| 2082 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 2083 | + | |
| 2084 | + | |
| 2085 | + | |
| 2086 | + <div> | |
| 2087 | + | |
| 2088 | + | |
| 2089 | + | |
| 2090 | + | |
| 2091 | + | |
| 2092 | + | |
| 2093 | + | |
| 2094 | + | |
| 2095 | + | |
| 2096 | + | |
| 2097 | + | |
| 2098 | + | |
| 2099 | + | |
| 2100 | + | |
| 2101 | + | |
| 2102 | + | |
| 2103 | + | |
| 2104 | + | |
| 2105 | + | |
| 2106 | + | |
| 2107 | + | |
| 2108 | + | |
| 2109 | + | |
| 2110 | +<div class="panelContainer " | |
| 2111 | + | |
| 2112 | + | |
| 2113 | + data-websites-component="/components/panelContainer.v1" | |
| 2114 | + data-panel-container-lg-mg="20px" | |
| 2115 | + data-panel-container-lg-pd="" | |
| 2116 | + data-panel-container-lg-ht="" | |
| 2117 | + data-panel-container-md-mg="20px 0 0 0" | |
| 2118 | + data-panel-container-md-pd="" | |
| 2119 | + data-panel-container-md-ht="" | |
| 2120 | + data-panel-container-sm-mg="20px 0 0 0" | |
| 2121 | + data-panel-container-sm-pd="" | |
| 2122 | + data-panel-container-sm-ht="" | |
| 2123 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 2124 | + data-panel-container-xs-pd="" | |
| 2125 | + data-panel-container-xs-ht="" | |
| 2126 | + data-panel-container-limit=""> | |
| 2127 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 2128 | + | |
| 2129 | + | |
| 2130 | + | |
| 2131 | + | |
| 2132 | + | |
| 2133 | + | |
| 2134 | + | |
| 2135 | + | |
| 2136 | + | |
| 2137 | + | |
| 2138 | + | |
| 2139 | + | |
| 2140 | + | |
| 2141 | + | |
| 2142 | + | |
| 2143 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_textandimage" class="text-image-container " | |
| 2144 | + data-text-image-container-right-left="false"> | |
| 2145 | + | |
| 2146 | + | |
| 2147 | + | |
| 2148 | + | |
| 2149 | + | |
| 2150 | + | |
| 2151 | + | |
| 2152 | + | |
| 2153 | + | |
| 2154 | + <div class="row text-image-row" | |
| 2155 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 2156 | + | |
| 2157 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 2158 | + | |
| 2159 | + | |
| 2160 | + | |
| 2161 | + | |
| 2162 | + | |
| 2163 | + data-text-image-rowcontainer-height-lg="0" | |
| 2164 | + data-text-image-rowcontainer-width-lg="0" | |
| 2165 | + data-text-image-rowcontainer-class-lg="" | |
| 2166 | + | |
| 2167 | + data-text-image-rowcontainer-bg-type-md="" | |
| 2168 | + | |
| 2169 | + | |
| 2170 | + | |
| 2171 | + | |
| 2172 | + | |
| 2173 | + data-text-image-rowcontainer-height-md="0" | |
| 2174 | + data-text-image-rowcontainer-width-md="0" | |
| 2175 | + data-text-image-rowcontainer-class-md="" | |
| 2176 | + | |
| 2177 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 2178 | + | |
| 2179 | + | |
| 2180 | + | |
| 2181 | + | |
| 2182 | + | |
| 2183 | + data-text-image-rowcontainer-height-sm="0" | |
| 2184 | + data-text-image-rowcontainer-width-sm="0" | |
| 2185 | + data-text-image-rowcontainer-class-sm="" | |
| 2186 | + | |
| 2187 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 2188 | + | |
| 2189 | + | |
| 2190 | + | |
| 2191 | + | |
| 2192 | + | |
| 2193 | + data-text-image-rowcontainer-height-xs="0" | |
| 2194 | + data-text-image-rowcontainer-width-xs="0" | |
| 2195 | + data-text-image-rowcontainer-class-xs=""> | |
| 2196 | + | |
| 2197 | + <div class="col-xs-12 text-image-text-container | |
| 2198 | + initializing" ><p class="chapeau3" style="text-align: center;"><span static-token='tac5ans|percent:"true"'>${p1.tac5ans|percent:"true"}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p> | |
| 2199 | +<p style="text-align: center;">APR<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">2</a></sup></p></div> | |
| 2200 | + </div> | |
| 2201 | + | |
| 2202 | + | |
| 2203 | + | |
| 2204 | + | |
| 2205 | + | |
| 2206 | + | |
| 2207 | + | |
| 2208 | + | |
| 2209 | + | |
| 2210 | + | |
| 2211 | + | |
| 2212 | + | |
| 2213 | + <script> | |
| 2214 | + (function(){ | |
| 2215 | + var $el; | |
| 2216 | + var listeners = []; | |
| 2217 | + var dataLayerViewEventName = ''; | |
| 2218 | + var dataLayerViewLayerProperties = []; | |
| 2219 | + | |
| 2220 | + dataLayerViewEventName = ''; | |
| 2221 | + | |
| 2222 | + | |
| 2223 | + | |
| 2224 | + | |
| 2225 | + | |
| 2226 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 2227 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 2228 | + if(document.currentScript){ | |
| 2229 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 2230 | + } else { | |
| 2231 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 2232 | + var currentScript = scripts[scripts.length - 1]; | |
| 2233 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 2234 | + } | |
| 2235 | + | |
| 2236 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 2237 | + Websites.Product.TextContent.initTextContent({ | |
| 2238 | + $el: $el, | |
| 2239 | + capsuleAlias: "", | |
| 2240 | + listeners: listeners, | |
| 2241 | + products: Websites.Product.Core.determineProductsArray(""), | |
| 2242 | + dataLayerViewEvent: { | |
| 2243 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 2244 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys2_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_textandimage" , | |
| 2245 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 2246 | + } | |
| 2247 | + }); | |
| 2248 | + }); | |
| 2249 | + })(); | |
| 2250 | + | |
| 2251 | + </script> | |
| 2252 | + | |
| 2253 | + | |
| 2254 | + | |
| 2255 | + | |
| 2256 | + | |
| 2257 | +</div> | |
| 2258 | + | |
| 2259 | + <script> | |
| 2260 | + | |
| 2261 | + /** | |
| 2262 | + * clickEventDownloadHandler() | |
| 2263 | + * Is used to handle download image action selected as an opening mode | |
| 2264 | + * | |
| 2265 | + */ | |
| 2266 | + | |
| 2267 | + var firstDownload = true; | |
| 2268 | + | |
| 2269 | + function clickEventDownloadHandler() { | |
| 2270 | + | |
| 2271 | + var link = this; | |
| 2272 | + var filename = link.dataset.linkpath; | |
| 2273 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 2274 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 2275 | + | |
| 2276 | + if (newFile) { | |
| 2277 | + | |
| 2278 | + if (firstDownload) { | |
| 2279 | + firstDownload = false; | |
| 2280 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 2281 | + } else { | |
| 2282 | + this.href = link.href; | |
| 2283 | + } | |
| 2284 | + | |
| 2285 | + this.download = fn; | |
| 2286 | + | |
| 2287 | + } else { | |
| 2288 | + this.download = fn + ".html"; | |
| 2289 | + } | |
| 2290 | + } | |
| 2291 | + | |
| 2292 | + </script></div> | |
| 2293 | + | |
| 2294 | +</div> | |
| 2295 | + | |
| 2296 | +</div> | |
| 2297 | + | |
| 2298 | + | |
| 2299 | + | |
| 2300 | +<!--/* Initialize Js */--> | |
| 2301 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer_1021323156"> | |
| 2302 | + if(""){ | |
| 2303 | + new Websites.Sticky({ | |
| 2304 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_/parsys/panelcontainer_1021323156", | |
| 2305 | + breakpoint: { | |
| 2306 | + lg: { | |
| 2307 | + to: "none" | |
| 2308 | + }, | |
| 2309 | + md: { | |
| 2310 | + to: "none" | |
| 2311 | + }, | |
| 2312 | + sm: { | |
| 2313 | + to: "none", | |
| 2314 | + }, | |
| 2315 | + xs: { | |
| 2316 | + to: "none" | |
| 2317 | + } | |
| 2318 | + } | |
| 2319 | + }); | |
| 2320 | + } | |
| 2321 | +</script> | |
| 2322 | + | |
| 2323 | +</div> | |
| 2324 | +</div> | |
| 2325 | + | |
| 2326 | +</div> | |
| 2327 | + | |
| 2328 | +</div> | |
| 2329 | + | |
| 2330 | + | |
| 2331 | + | |
| 2332 | +<!--/* Initialize Js */--> | |
| 2333 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_"> | |
| 2334 | + if(""){ | |
| 2335 | + new Websites.Sticky({ | |
| 2336 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys2/panelcontainer_copy_", | |
| 2337 | + breakpoint: { | |
| 2338 | + lg: { | |
| 2339 | + to: "none" | |
| 2340 | + }, | |
| 2341 | + md: { | |
| 2342 | + to: "none" | |
| 2343 | + }, | |
| 2344 | + sm: { | |
| 2345 | + to: "none", | |
| 2346 | + }, | |
| 2347 | + xs: { | |
| 2348 | + to: "none" | |
| 2349 | + } | |
| 2350 | + } | |
| 2351 | + }); | |
| 2352 | + } | |
| 2353 | +</script> | |
| 2354 | + | |
| 2355 | +</div> | |
| 2356 | +</div> | |
| 2357 | + | |
| 2358 | +</div> | |
| 2359 | + | |
| 2360 | + </div> | |
| 2361 | + | |
| 2362 | + <div class="col-xs-12 col-sm-4 column col-last "> | |
| 2363 | + <div class="parsys3 parsys"><div class="panelContainer section"> | |
| 2364 | + | |
| 2365 | + | |
| 2366 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 2367 | + | |
| 2368 | + | |
| 2369 | + | |
| 2370 | + <div> | |
| 2371 | + | |
| 2372 | + | |
| 2373 | + | |
| 2374 | + | |
| 2375 | + | |
| 2376 | + | |
| 2377 | + | |
| 2378 | + | |
| 2379 | + | |
| 2380 | + | |
| 2381 | + | |
| 2382 | + | |
| 2383 | + | |
| 2384 | + | |
| 2385 | + | |
| 2386 | + | |
| 2387 | + | |
| 2388 | + | |
| 2389 | + | |
| 2390 | + | |
| 2391 | + | |
| 2392 | + | |
| 2393 | + | |
| 2394 | +<div class="panelContainer panel-border panel-border-radius " | |
| 2395 | + | |
| 2396 | + | |
| 2397 | + data-websites-component="/components/panelContainer.v1" | |
| 2398 | + data-panel-container-lg-mg="" | |
| 2399 | + data-panel-container-lg-pd="20px" | |
| 2400 | + data-panel-container-lg-ht="" | |
| 2401 | + data-panel-container-md-mg="" | |
| 2402 | + data-panel-container-md-pd="20px" | |
| 2403 | + data-panel-container-md-ht="" | |
| 2404 | + data-panel-container-sm-mg="" | |
| 2405 | + data-panel-container-sm-pd="20px" | |
| 2406 | + data-panel-container-sm-ht="" | |
| 2407 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 2408 | + data-panel-container-xs-pd="20px" | |
| 2409 | + data-panel-container-xs-ht="" | |
| 2410 | + data-panel-container-limit=""> | |
| 2411 | + <div class="parsys"><div class="panelContainer section"> | |
| 2412 | + | |
| 2413 | + | |
| 2414 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 2415 | + | |
| 2416 | + | |
| 2417 | + | |
| 2418 | + <div> | |
| 2419 | + | |
| 2420 | + | |
| 2421 | + | |
| 2422 | + | |
| 2423 | + | |
| 2424 | + | |
| 2425 | + | |
| 2426 | + | |
| 2427 | + | |
| 2428 | + | |
| 2429 | + | |
| 2430 | + | |
| 2431 | + | |
| 2432 | + | |
| 2433 | + | |
| 2434 | + | |
| 2435 | + | |
| 2436 | + | |
| 2437 | + | |
| 2438 | + | |
| 2439 | + | |
| 2440 | + | |
| 2441 | + | |
| 2442 | +<div class="panelContainer background-tertiary-pinkPastel " | |
| 2443 | + | |
| 2444 | + | |
| 2445 | + data-websites-component="/components/panelContainer.v1" | |
| 2446 | + data-panel-container-lg-mg="0 30%" | |
| 2447 | + data-panel-container-lg-pd="10px 0 0 0" | |
| 2448 | + data-panel-container-lg-ht="" | |
| 2449 | + data-panel-container-md-mg="0 20%" | |
| 2450 | + data-panel-container-md-pd="10px 0 0 0" | |
| 2451 | + data-panel-container-md-ht="" | |
| 2452 | + data-panel-container-sm-mg="" | |
| 2453 | + data-panel-container-sm-pd="10px 0 0 0" | |
| 2454 | + data-panel-container-sm-ht="" | |
| 2455 | + data-panel-container-xs-mg="0 30%" | |
| 2456 | + data-panel-container-xs-pd="10px 0 0 0" | |
| 2457 | + data-panel-container-xs-ht="" | |
| 2458 | + data-panel-container-limit=""> | |
| 2459 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 2460 | + | |
| 2461 | + | |
| 2462 | + | |
| 2463 | + | |
| 2464 | + | |
| 2465 | + | |
| 2466 | + | |
| 2467 | + | |
| 2468 | + | |
| 2469 | + | |
| 2470 | + | |
| 2471 | + | |
| 2472 | + | |
| 2473 | + | |
| 2474 | + | |
| 2475 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1939379463_parsys_textandimage" class="text-image-container " | |
| 2476 | + data-text-image-container-right-left="false"> | |
| 2477 | + | |
| 2478 | + | |
| 2479 | + | |
| 2480 | + | |
| 2481 | + | |
| 2482 | + | |
| 2483 | + | |
| 2484 | + | |
| 2485 | + | |
| 2486 | + <div class="row text-image-row" | |
| 2487 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 2488 | + | |
| 2489 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 2490 | + | |
| 2491 | + | |
| 2492 | + | |
| 2493 | + | |
| 2494 | + | |
| 2495 | + data-text-image-rowcontainer-height-lg="0" | |
| 2496 | + data-text-image-rowcontainer-width-lg="0" | |
| 2497 | + data-text-image-rowcontainer-class-lg="backgroundColor72BFC1--80" | |
| 2498 | + | |
| 2499 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 2500 | + | |
| 2501 | + | |
| 2502 | + | |
| 2503 | + | |
| 2504 | + | |
| 2505 | + data-text-image-rowcontainer-height-md="0" | |
| 2506 | + data-text-image-rowcontainer-width-md="0" | |
| 2507 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 2508 | + | |
| 2509 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 2510 | + | |
| 2511 | + | |
| 2512 | + | |
| 2513 | + | |
| 2514 | + | |
| 2515 | + data-text-image-rowcontainer-height-sm="0" | |
| 2516 | + data-text-image-rowcontainer-width-sm="0" | |
| 2517 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 2518 | + | |
| 2519 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 2520 | + | |
| 2521 | + | |
| 2522 | + | |
| 2523 | + | |
| 2524 | + | |
| 2525 | + data-text-image-rowcontainer-height-xs="0" | |
| 2526 | + data-text-image-rowcontainer-width-xs="0" | |
| 2527 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 2528 | + | |
| 2529 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><b>PROMOTION</b></p> | |
| 2530 | +</div> | |
| 2531 | + </div> | |
| 2532 | + | |
| 2533 | + | |
| 2534 | + | |
| 2535 | + | |
| 2536 | + | |
| 2537 | + | |
| 2538 | + | |
| 2539 | + | |
| 2540 | + | |
| 2541 | + | |
| 2542 | + | |
| 2543 | + <script> | |
| 2544 | + | |
| 2545 | + (function(){ | |
| 2546 | + | |
| 2547 | + var dataLayerViewEventName = '' || ''; | |
| 2548 | + var dataLayerViewLayerProperties = []; | |
| 2549 | + var $el; | |
| 2550 | + | |
| 2551 | + | |
| 2552 | + | |
| 2553 | + if(dataLayerViewEventName.trim().length) { | |
| 2554 | + | |
| 2555 | + var obj = { | |
| 2556 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 2557 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1939379463_parsys_textandimage" , | |
| 2558 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 2559 | + }; | |
| 2560 | + | |
| 2561 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 2562 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 2563 | + if(document.currentScript){ | |
| 2564 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 2565 | + } else { | |
| 2566 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 2567 | + var currentScript = scripts[scripts.length - 1]; | |
| 2568 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 2569 | + } | |
| 2570 | + | |
| 2571 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 2572 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 2573 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 2574 | + | |
| 2575 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 2576 | + | |
| 2577 | + } | |
| 2578 | + | |
| 2579 | + })(); | |
| 2580 | + | |
| 2581 | + </script> | |
| 2582 | + | |
| 2583 | +</div> | |
| 2584 | + | |
| 2585 | + <script> | |
| 2586 | + | |
| 2587 | + /** | |
| 2588 | + * clickEventDownloadHandler() | |
| 2589 | + * Is used to handle download image action selected as an opening mode | |
| 2590 | + * | |
| 2591 | + */ | |
| 2592 | + | |
| 2593 | + var firstDownload = true; | |
| 2594 | + | |
| 2595 | + function clickEventDownloadHandler() { | |
| 2596 | + | |
| 2597 | + var link = this; | |
| 2598 | + var filename = link.dataset.linkpath; | |
| 2599 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 2600 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 2601 | + | |
| 2602 | + if (newFile) { | |
| 2603 | + | |
| 2604 | + if (firstDownload) { | |
| 2605 | + firstDownload = false; | |
| 2606 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 2607 | + } else { | |
| 2608 | + this.href = link.href; | |
| 2609 | + } | |
| 2610 | + | |
| 2611 | + this.download = fn; | |
| 2612 | + | |
| 2613 | + } else { | |
| 2614 | + this.download = fn + ".html"; | |
| 2615 | + } | |
| 2616 | + } | |
| 2617 | + | |
| 2618 | + </script></div> | |
| 2619 | + | |
| 2620 | +</div> | |
| 2621 | + | |
| 2622 | +</div> | |
| 2623 | + | |
| 2624 | + | |
| 2625 | + | |
| 2626 | +<!--/* Initialize Js */--> | |
| 2627 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1939379463"> | |
| 2628 | + if(""){ | |
| 2629 | + new Websites.Sticky({ | |
| 2630 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1939379463", | |
| 2631 | + breakpoint: { | |
| 2632 | + lg: { | |
| 2633 | + to: "none" | |
| 2634 | + }, | |
| 2635 | + md: { | |
| 2636 | + to: "none" | |
| 2637 | + }, | |
| 2638 | + sm: { | |
| 2639 | + to: "none", | |
| 2640 | + }, | |
| 2641 | + xs: { | |
| 2642 | + to: "none" | |
| 2643 | + } | |
| 2644 | + } | |
| 2645 | + }); | |
| 2646 | + } | |
| 2647 | +</script> | |
| 2648 | + | |
| 2649 | +</div> | |
| 2650 | +</div> | |
| 2651 | +<div class="panelContainer section"> | |
| 2652 | + | |
| 2653 | + | |
| 2654 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 2655 | + | |
| 2656 | + | |
| 2657 | + | |
| 2658 | + <div> | |
| 2659 | + | |
| 2660 | + | |
| 2661 | + | |
| 2662 | + | |
| 2663 | + | |
| 2664 | + | |
| 2665 | + | |
| 2666 | + | |
| 2667 | + | |
| 2668 | + | |
| 2669 | + | |
| 2670 | + | |
| 2671 | + | |
| 2672 | + | |
| 2673 | + | |
| 2674 | + | |
| 2675 | + | |
| 2676 | + | |
| 2677 | + | |
| 2678 | + | |
| 2679 | + | |
| 2680 | + | |
| 2681 | + | |
| 2682 | +<div class="panelContainer " | |
| 2683 | + | |
| 2684 | + | |
| 2685 | + data-websites-component="/components/panelContainer.v1" | |
| 2686 | + data-panel-container-lg-mg="20px" | |
| 2687 | + data-panel-container-lg-pd="" | |
| 2688 | + data-panel-container-lg-ht="" | |
| 2689 | + data-panel-container-md-mg="20px 0 0 0" | |
| 2690 | + data-panel-container-md-pd="" | |
| 2691 | + data-panel-container-md-ht="" | |
| 2692 | + data-panel-container-sm-mg="20px 0 0 0" | |
| 2693 | + data-panel-container-sm-pd="" | |
| 2694 | + data-panel-container-sm-ht="" | |
| 2695 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 2696 | + data-panel-container-xs-pd="" | |
| 2697 | + data-panel-container-xs-ht="" | |
| 2698 | + data-panel-container-limit=""> | |
| 2699 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 2700 | + | |
| 2701 | + | |
| 2702 | + | |
| 2703 | + | |
| 2704 | + | |
| 2705 | + | |
| 2706 | + | |
| 2707 | + | |
| 2708 | + | |
| 2709 | + | |
| 2710 | + | |
| 2711 | + | |
| 2712 | + | |
| 2713 | + | |
| 2714 | + | |
| 2715 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 2716 | + data-text-image-container-right-left="false"> | |
| 2717 | + | |
| 2718 | + | |
| 2719 | + | |
| 2720 | + | |
| 2721 | + | |
| 2722 | + | |
| 2723 | + | |
| 2724 | + | |
| 2725 | + | |
| 2726 | + <div class="row text-image-row" | |
| 2727 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 2728 | + | |
| 2729 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 2730 | + | |
| 2731 | + | |
| 2732 | + | |
| 2733 | + | |
| 2734 | + | |
| 2735 | + data-text-image-rowcontainer-height-lg="0" | |
| 2736 | + data-text-image-rowcontainer-width-lg="0" | |
| 2737 | + data-text-image-rowcontainer-class-lg="" | |
| 2738 | + | |
| 2739 | + data-text-image-rowcontainer-bg-type-md="" | |
| 2740 | + | |
| 2741 | + | |
| 2742 | + | |
| 2743 | + | |
| 2744 | + | |
| 2745 | + data-text-image-rowcontainer-height-md="0" | |
| 2746 | + data-text-image-rowcontainer-width-md="0" | |
| 2747 | + data-text-image-rowcontainer-class-md="" | |
| 2748 | + | |
| 2749 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 2750 | + | |
| 2751 | + | |
| 2752 | + | |
| 2753 | + | |
| 2754 | + | |
| 2755 | + data-text-image-rowcontainer-height-sm="0" | |
| 2756 | + data-text-image-rowcontainer-width-sm="0" | |
| 2757 | + data-text-image-rowcontainer-class-sm="" | |
| 2758 | + | |
| 2759 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 2760 | + | |
| 2761 | + | |
| 2762 | + | |
| 2763 | + | |
| 2764 | + | |
| 2765 | + data-text-image-rowcontainer-height-xs="0" | |
| 2766 | + data-text-image-rowcontainer-width-xs="0" | |
| 2767 | + data-text-image-rowcontainer-class-xs=""> | |
| 2768 | + | |
| 2769 | + <div class="col-xs-12 text-image-text-container | |
| 2770 | + initializing" ><p style="text-align: center;"><b>5 year</b> variable rate<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">7</a></sup></p> | |
| 2771 | +<p class="chapeau3" style="text-align: center;"><span static-token='tauxPromo5ansF|percent:"true"'>${p2.tauxPromo5ansF|percent:"true"}</span><br> | |
| 2772 | +</p></div> | |
| 2773 | + </div> | |
| 2774 | + | |
| 2775 | + | |
| 2776 | + | |
| 2777 | + | |
| 2778 | + | |
| 2779 | + | |
| 2780 | + | |
| 2781 | + | |
| 2782 | + | |
| 2783 | + | |
| 2784 | + | |
| 2785 | + | |
| 2786 | + <script> | |
| 2787 | + (function(){ | |
| 2788 | + var $el; | |
| 2789 | + var listeners = []; | |
| 2790 | + var dataLayerViewEventName = ''; | |
| 2791 | + var dataLayerViewLayerProperties = []; | |
| 2792 | + | |
| 2793 | + dataLayerViewEventName = ''; | |
| 2794 | + | |
| 2795 | + | |
| 2796 | + | |
| 2797 | + | |
| 2798 | + | |
| 2799 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 2800 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 2801 | + if(document.currentScript){ | |
| 2802 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 2803 | + } else { | |
| 2804 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 2805 | + var currentScript = scripts[scripts.length - 1]; | |
| 2806 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 2807 | + } | |
| 2808 | + | |
| 2809 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 2810 | + Websites.Product.TextContent.initTextContent({ | |
| 2811 | + $el: $el, | |
| 2812 | + capsuleAlias: "", | |
| 2813 | + listeners: listeners, | |
| 2814 | + products: Websites.Product.Core.determineProductsArray(""), | |
| 2815 | + dataLayerViewEvent: { | |
| 2816 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 2817 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_parsys_textandimage" , | |
| 2818 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 2819 | + } | |
| 2820 | + }); | |
| 2821 | + }); | |
| 2822 | + })(); | |
| 2823 | + | |
| 2824 | + </script> | |
| 2825 | + | |
| 2826 | + | |
| 2827 | + | |
| 2828 | + | |
| 2829 | + | |
| 2830 | +</div> | |
| 2831 | + | |
| 2832 | + <script> | |
| 2833 | + | |
| 2834 | + /** | |
| 2835 | + * clickEventDownloadHandler() | |
| 2836 | + * Is used to handle download image action selected as an opening mode | |
| 2837 | + * | |
| 2838 | + */ | |
| 2839 | + | |
| 2840 | + var firstDownload = true; | |
| 2841 | + | |
| 2842 | + function clickEventDownloadHandler() { | |
| 2843 | + | |
| 2844 | + var link = this; | |
| 2845 | + var filename = link.dataset.linkpath; | |
| 2846 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 2847 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 2848 | + | |
| 2849 | + if (newFile) { | |
| 2850 | + | |
| 2851 | + if (firstDownload) { | |
| 2852 | + firstDownload = false; | |
| 2853 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 2854 | + } else { | |
| 2855 | + this.href = link.href; | |
| 2856 | + } | |
| 2857 | + | |
| 2858 | + this.download = fn; | |
| 2859 | + | |
| 2860 | + } else { | |
| 2861 | + this.download = fn + ".html"; | |
| 2862 | + } | |
| 2863 | + } | |
| 2864 | + | |
| 2865 | + </script></div> | |
| 2866 | + | |
| 2867 | +</div> | |
| 2868 | + | |
| 2869 | +</div> | |
| 2870 | + | |
| 2871 | + | |
| 2872 | + | |
| 2873 | +<!--/* Initialize Js */--> | |
| 2874 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer"> | |
| 2875 | + if(""){ | |
| 2876 | + new Websites.Sticky({ | |
| 2877 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer", | |
| 2878 | + breakpoint: { | |
| 2879 | + lg: { | |
| 2880 | + to: "none" | |
| 2881 | + }, | |
| 2882 | + md: { | |
| 2883 | + to: "none" | |
| 2884 | + }, | |
| 2885 | + sm: { | |
| 2886 | + to: "none", | |
| 2887 | + }, | |
| 2888 | + xs: { | |
| 2889 | + to: "none" | |
| 2890 | + } | |
| 2891 | + } | |
| 2892 | + }); | |
| 2893 | + } | |
| 2894 | +</script> | |
| 2895 | + | |
| 2896 | +</div> | |
| 2897 | +</div> | |
| 2898 | +<div class="separator section"> | |
| 2899 | + | |
| 2900 | + | |
| 2901 | + | |
| 2902 | + | |
| 2903 | + | |
| 2904 | + | |
| 2905 | +<div id="separator-54b0dfd9db" class="cmp-separator"> | |
| 2906 | + <hr class="cmp-separator__horizontal-rule"/> | |
| 2907 | +</div></div> | |
| 2908 | +<div class="panelContainer section"> | |
| 2909 | + | |
| 2910 | + | |
| 2911 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 2912 | + | |
| 2913 | + | |
| 2914 | + | |
| 2915 | + <div> | |
| 2916 | + | |
| 2917 | + | |
| 2918 | + | |
| 2919 | + | |
| 2920 | + | |
| 2921 | + | |
| 2922 | + | |
| 2923 | + | |
| 2924 | + | |
| 2925 | + | |
| 2926 | + | |
| 2927 | + | |
| 2928 | + | |
| 2929 | + | |
| 2930 | + | |
| 2931 | + | |
| 2932 | + | |
| 2933 | + | |
| 2934 | + | |
| 2935 | + | |
| 2936 | + | |
| 2937 | + | |
| 2938 | + | |
| 2939 | +<div class="panelContainer " | |
| 2940 | + | |
| 2941 | + | |
| 2942 | + data-websites-component="/components/panelContainer.v1" | |
| 2943 | + data-panel-container-lg-mg="20px" | |
| 2944 | + data-panel-container-lg-pd="" | |
| 2945 | + data-panel-container-lg-ht="" | |
| 2946 | + data-panel-container-md-mg="20px 0 0 0" | |
| 2947 | + data-panel-container-md-pd="" | |
| 2948 | + data-panel-container-md-ht="" | |
| 2949 | + data-panel-container-sm-mg="20px 0 0 0" | |
| 2950 | + data-panel-container-sm-pd="" | |
| 2951 | + data-panel-container-sm-ht="" | |
| 2952 | + data-panel-container-xs-mg="20px 0 0 0" | |
| 2953 | + data-panel-container-xs-pd="" | |
| 2954 | + data-panel-container-xs-ht="" | |
| 2955 | + data-panel-container-limit=""> | |
| 2956 | + <div class="parsys"><div class="columns parbase section"> | |
| 2957 | + | |
| 2958 | + | |
| 2959 | + | |
| 2960 | + | |
| 2961 | +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div> | |
| 2962 | + | |
| 2963 | + | |
| 2964 | + | |
| 2965 | + | |
| 2966 | + | |
| 2967 | + | |
| 2968 | + | |
| 2969 | + | |
| 2970 | + | |
| 2971 | + | |
| 2972 | + | |
| 2973 | + | |
| 2974 | + | |
| 2975 | + <div style="" | |
| 2976 | + class="columns-row row row-eq-height" | |
| 2977 | + | |
| 2978 | + data-style-lg="" data-height-lg="" | |
| 2979 | + data-width-lg="" | |
| 2980 | + data-background-color-lg="" | |
| 2981 | + data-background-color-xs=""> | |
| 2982 | + <div style="" | |
| 2983 | + class="col-xs-12 col-sm-12 columns-title " | |
| 2984 | + data-height="" data-width="" | |
| 2985 | + data-style-xs="" data-height-xs="" | |
| 2986 | + data-width-xs=""> | |
| 2987 | + | |
| 2988 | + </div> | |
| 2989 | + | |
| 2990 | + | |
| 2991 | + | |
| 2992 | + | |
| 2993 | + <div class="col-xs-12 col-sm-6 column col-first separatorFilet"> | |
| 2994 | + <div class="parsys1 parsys"><div class="panelContainer section"> | |
| 2995 | + | |
| 2996 | + | |
| 2997 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 2998 | + | |
| 2999 | + | |
| 3000 | + | |
| 3001 | + <div> | |
| 3002 | + | |
| 3003 | + | |
| 3004 | + | |
| 3005 | + | |
| 3006 | + | |
| 3007 | + | |
| 3008 | + | |
| 3009 | + | |
| 3010 | + | |
| 3011 | + | |
| 3012 | + | |
| 3013 | + | |
| 3014 | + | |
| 3015 | + | |
| 3016 | + | |
| 3017 | + | |
| 3018 | + | |
| 3019 | + | |
| 3020 | + | |
| 3021 | + | |
| 3022 | + | |
| 3023 | + | |
| 3024 | + | |
| 3025 | +<div class="panelContainer " | |
| 3026 | + | |
| 3027 | + | |
| 3028 | + data-websites-component="/components/panelContainer.v1" | |
| 3029 | + data-panel-container-lg-mg="" | |
| 3030 | + data-panel-container-lg-pd="" | |
| 3031 | + data-panel-container-lg-ht="" | |
| 3032 | + data-panel-container-md-mg="" | |
| 3033 | + data-panel-container-md-pd="" | |
| 3034 | + data-panel-container-md-ht="" | |
| 3035 | + data-panel-container-sm-mg="" | |
| 3036 | + data-panel-container-sm-pd="" | |
| 3037 | + data-panel-container-sm-ht="" | |
| 3038 | + data-panel-container-xs-mg="" | |
| 3039 | + data-panel-container-xs-pd="" | |
| 3040 | + data-panel-container-xs-ht="" | |
| 3041 | + data-panel-container-limit=""> | |
| 3042 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 3043 | + | |
| 3044 | + | |
| 3045 | + | |
| 3046 | + | |
| 3047 | + | |
| 3048 | + | |
| 3049 | + | |
| 3050 | + | |
| 3051 | + | |
| 3052 | + | |
| 3053 | + | |
| 3054 | + | |
| 3055 | + | |
| 3056 | + | |
| 3057 | + | |
| 3058 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_columns_parsys1_panelcontainer_parsys_textandimage_copy" class="text-image-container " | |
| 3059 | + data-text-image-container-right-left="false"> | |
| 3060 | + | |
| 3061 | + | |
| 3062 | + | |
| 3063 | + | |
| 3064 | + | |
| 3065 | + | |
| 3066 | + | |
| 3067 | + | |
| 3068 | + | |
| 3069 | + <div class="row text-image-row" | |
| 3070 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 3071 | + | |
| 3072 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 3073 | + | |
| 3074 | + | |
| 3075 | + | |
| 3076 | + | |
| 3077 | + | |
| 3078 | + data-text-image-rowcontainer-height-lg="0" | |
| 3079 | + data-text-image-rowcontainer-width-lg="0" | |
| 3080 | + data-text-image-rowcontainer-class-lg="" | |
| 3081 | + | |
| 3082 | + data-text-image-rowcontainer-bg-type-md="" | |
| 3083 | + | |
| 3084 | + | |
| 3085 | + | |
| 3086 | + | |
| 3087 | + | |
| 3088 | + data-text-image-rowcontainer-height-md="0" | |
| 3089 | + data-text-image-rowcontainer-width-md="0" | |
| 3090 | + data-text-image-rowcontainer-class-md="" | |
| 3091 | + | |
| 3092 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 3093 | + | |
| 3094 | + | |
| 3095 | + | |
| 3096 | + | |
| 3097 | + | |
| 3098 | + data-text-image-rowcontainer-height-sm="0" | |
| 3099 | + data-text-image-rowcontainer-width-sm="0" | |
| 3100 | + data-text-image-rowcontainer-class-sm="" | |
| 3101 | + | |
| 3102 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 3103 | + | |
| 3104 | + | |
| 3105 | + | |
| 3106 | + | |
| 3107 | + | |
| 3108 | + data-text-image-rowcontainer-height-xs="0" | |
| 3109 | + data-text-image-rowcontainer-width-xs="0" | |
| 3110 | + data-text-image-rowcontainer-class-xs=""> | |
| 3111 | + | |
| 3112 | + <div class="col-xs-12 text-image-text-container | |
| 3113 | + initializing" ><p style="text-align: center;">Prime rate –</p> | |
| 3114 | +<p class="chapeau3" style="text-align: center;"><span static-token='tauxBase|percent:"true"'>${p2.tauxBase|percent:"true"}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">***</a></p></div> | |
| 3115 | + </div> | |
| 3116 | + | |
| 3117 | + | |
| 3118 | + | |
| 3119 | + | |
| 3120 | + | |
| 3121 | + | |
| 3122 | + | |
| 3123 | + | |
| 3124 | + | |
| 3125 | + | |
| 3126 | + | |
| 3127 | + | |
| 3128 | + <script> | |
| 3129 | + (function(){ | |
| 3130 | + var $el; | |
| 3131 | + var listeners = []; | |
| 3132 | + var dataLayerViewEventName = ''; | |
| 3133 | + var dataLayerViewLayerProperties = []; | |
| 3134 | + | |
| 3135 | + dataLayerViewEventName = ''; | |
| 3136 | + | |
| 3137 | + | |
| 3138 | + | |
| 3139 | + | |
| 3140 | + | |
| 3141 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 3142 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 3143 | + if(document.currentScript){ | |
| 3144 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 3145 | + } else { | |
| 3146 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 3147 | + var currentScript = scripts[scripts.length - 1]; | |
| 3148 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 3149 | + } | |
| 3150 | + | |
| 3151 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 3152 | + Websites.Product.TextContent.initTextContent({ | |
| 3153 | + $el: $el, | |
| 3154 | + capsuleAlias: "", | |
| 3155 | + listeners: listeners, | |
| 3156 | + products: Websites.Product.Core.determineProductsArray(""), | |
| 3157 | + dataLayerViewEvent: { | |
| 3158 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 3159 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_columns_parsys1_panelcontainer_parsys_textandimage_copy" , | |
| 3160 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 3161 | + } | |
| 3162 | + }); | |
| 3163 | + }); | |
| 3164 | + })(); | |
| 3165 | + | |
| 3166 | + </script> | |
| 3167 | + | |
| 3168 | + | |
| 3169 | + | |
| 3170 | + | |
| 3171 | + | |
| 3172 | +</div> | |
| 3173 | + | |
| 3174 | + <script> | |
| 3175 | + | |
| 3176 | + /** | |
| 3177 | + * clickEventDownloadHandler() | |
| 3178 | + * Is used to handle download image action selected as an opening mode | |
| 3179 | + * | |
| 3180 | + */ | |
| 3181 | + | |
| 3182 | + var firstDownload = true; | |
| 3183 | + | |
| 3184 | + function clickEventDownloadHandler() { | |
| 3185 | + | |
| 3186 | + var link = this; | |
| 3187 | + var filename = link.dataset.linkpath; | |
| 3188 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 3189 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 3190 | + | |
| 3191 | + if (newFile) { | |
| 3192 | + | |
| 3193 | + if (firstDownload) { | |
| 3194 | + firstDownload = false; | |
| 3195 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 3196 | + } else { | |
| 3197 | + this.href = link.href; | |
| 3198 | + } | |
| 3199 | + | |
| 3200 | + this.download = fn; | |
| 3201 | + | |
| 3202 | + } else { | |
| 3203 | + this.download = fn + ".html"; | |
| 3204 | + } | |
| 3205 | + } | |
| 3206 | + | |
| 3207 | + </script></div> | |
| 3208 | + | |
| 3209 | +</div> | |
| 3210 | + | |
| 3211 | +</div> | |
| 3212 | + | |
| 3213 | + | |
| 3214 | + | |
| 3215 | +<!--/* Initialize Js */--> | |
| 3216 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156/parsys/columns/parsys1/panelcontainer"> | |
| 3217 | + if(""){ | |
| 3218 | + new Websites.Sticky({ | |
| 3219 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156/parsys/columns/parsys1/panelcontainer", | |
| 3220 | + breakpoint: { | |
| 3221 | + lg: { | |
| 3222 | + to: "" | |
| 3223 | + }, | |
| 3224 | + md: { | |
| 3225 | + to: "" | |
| 3226 | + }, | |
| 3227 | + sm: { | |
| 3228 | + to: "", | |
| 3229 | + }, | |
| 3230 | + xs: { | |
| 3231 | + to: "" | |
| 3232 | + } | |
| 3233 | + } | |
| 3234 | + }); | |
| 3235 | + } | |
| 3236 | +</script> | |
| 3237 | + | |
| 3238 | +</div> | |
| 3239 | +</div> | |
| 3240 | + | |
| 3241 | +</div> | |
| 3242 | + | |
| 3243 | + </div> | |
| 3244 | + | |
| 3245 | + <div class="col-xs-12 col-sm-6 column col-last "> | |
| 3246 | + <div class="parsys2 parsys"><div class="panelContainer section"> | |
| 3247 | + | |
| 3248 | + | |
| 3249 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 3250 | + | |
| 3251 | + | |
| 3252 | + | |
| 3253 | + <div> | |
| 3254 | + | |
| 3255 | + | |
| 3256 | + | |
| 3257 | + | |
| 3258 | + | |
| 3259 | + | |
| 3260 | + | |
| 3261 | + | |
| 3262 | + | |
| 3263 | + | |
| 3264 | + | |
| 3265 | + | |
| 3266 | + | |
| 3267 | + | |
| 3268 | + | |
| 3269 | + | |
| 3270 | + | |
| 3271 | + | |
| 3272 | + | |
| 3273 | + | |
| 3274 | + | |
| 3275 | + | |
| 3276 | + | |
| 3277 | +<div class="panelContainer " | |
| 3278 | + | |
| 3279 | + | |
| 3280 | + data-websites-component="/components/panelContainer.v1" | |
| 3281 | + data-panel-container-lg-mg="" | |
| 3282 | + data-panel-container-lg-pd="" | |
| 3283 | + data-panel-container-lg-ht="" | |
| 3284 | + data-panel-container-md-mg="" | |
| 3285 | + data-panel-container-md-pd="" | |
| 3286 | + data-panel-container-md-ht="" | |
| 3287 | + data-panel-container-sm-mg="" | |
| 3288 | + data-panel-container-sm-pd="" | |
| 3289 | + data-panel-container-sm-ht="" | |
| 3290 | + data-panel-container-xs-mg="" | |
| 3291 | + data-panel-container-xs-pd="" | |
| 3292 | + data-panel-container-xs-ht="" | |
| 3293 | + data-panel-container-limit=""> | |
| 3294 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 3295 | + | |
| 3296 | + | |
| 3297 | + | |
| 3298 | + | |
| 3299 | + | |
| 3300 | + | |
| 3301 | + | |
| 3302 | + | |
| 3303 | + | |
| 3304 | + | |
| 3305 | + | |
| 3306 | + | |
| 3307 | + | |
| 3308 | + | |
| 3309 | + | |
| 3310 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_columns_parsys2_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 3311 | + data-text-image-container-right-left="false"> | |
| 3312 | + | |
| 3313 | + | |
| 3314 | + | |
| 3315 | + | |
| 3316 | + | |
| 3317 | + | |
| 3318 | + | |
| 3319 | + | |
| 3320 | + | |
| 3321 | + <div class="row text-image-row" | |
| 3322 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 3323 | + | |
| 3324 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 3325 | + | |
| 3326 | + | |
| 3327 | + | |
| 3328 | + | |
| 3329 | + | |
| 3330 | + data-text-image-rowcontainer-height-lg="0" | |
| 3331 | + data-text-image-rowcontainer-width-lg="0" | |
| 3332 | + data-text-image-rowcontainer-class-lg="" | |
| 3333 | + | |
| 3334 | + data-text-image-rowcontainer-bg-type-md="" | |
| 3335 | + | |
| 3336 | + | |
| 3337 | + | |
| 3338 | + | |
| 3339 | + | |
| 3340 | + data-text-image-rowcontainer-height-md="0" | |
| 3341 | + data-text-image-rowcontainer-width-md="0" | |
| 3342 | + data-text-image-rowcontainer-class-md="" | |
| 3343 | + | |
| 3344 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 3345 | + | |
| 3346 | + | |
| 3347 | + | |
| 3348 | + | |
| 3349 | + | |
| 3350 | + data-text-image-rowcontainer-height-sm="0" | |
| 3351 | + data-text-image-rowcontainer-width-sm="0" | |
| 3352 | + data-text-image-rowcontainer-class-sm="" | |
| 3353 | + | |
| 3354 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 3355 | + | |
| 3356 | + | |
| 3357 | + | |
| 3358 | + | |
| 3359 | + | |
| 3360 | + data-text-image-rowcontainer-height-xs="0" | |
| 3361 | + data-text-image-rowcontainer-width-xs="0" | |
| 3362 | + data-text-image-rowcontainer-class-xs=""> | |
| 3363 | + | |
| 3364 | + <div class="col-xs-12 text-image-text-container | |
| 3365 | + initializing" ><p class="chapeau3" style="text-align: center;"><span static-token='tac5ans|percent:"true"'>${p2.tac5ans|percent:"true"}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p> | |
| 3366 | +<p style="text-align: center;">APR<sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">2</a></sup></p></div> | |
| 3367 | + </div> | |
| 3368 | + | |
| 3369 | + | |
| 3370 | + | |
| 3371 | + | |
| 3372 | + | |
| 3373 | + | |
| 3374 | + | |
| 3375 | + | |
| 3376 | + | |
| 3377 | + | |
| 3378 | + | |
| 3379 | + | |
| 3380 | + <script> | |
| 3381 | + (function(){ | |
| 3382 | + var $el; | |
| 3383 | + var listeners = []; | |
| 3384 | + var dataLayerViewEventName = ''; | |
| 3385 | + var dataLayerViewLayerProperties = []; | |
| 3386 | + | |
| 3387 | + dataLayerViewEventName = ''; | |
| 3388 | + | |
| 3389 | + | |
| 3390 | + | |
| 3391 | + | |
| 3392 | + | |
| 3393 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 3394 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 3395 | + if(document.currentScript){ | |
| 3396 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 3397 | + } else { | |
| 3398 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 3399 | + var currentScript = scripts[scripts.length - 1]; | |
| 3400 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 3401 | + } | |
| 3402 | + | |
| 3403 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 3404 | + Websites.Product.TextContent.initTextContent({ | |
| 3405 | + $el: $el, | |
| 3406 | + capsuleAlias: "", | |
| 3407 | + listeners: listeners, | |
| 3408 | + products: Websites.Product.Core.determineProductsArray(""), | |
| 3409 | + dataLayerViewEvent: { | |
| 3410 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 3411 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_panelcontainer_copy_parsys_columns_copy_copy_co_parsys3_panelcontainer_copy__parsys_panelcontainer_1021323156_parsys_columns_parsys2_panelcontainer_parsys_textandimage" , | |
| 3412 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 3413 | + } | |
| 3414 | + }); | |
| 3415 | + }); | |
| 3416 | + })(); | |
| 3417 | + | |
| 3418 | + </script> | |
| 3419 | + | |
| 3420 | + | |
| 3421 | + | |
| 3422 | + | |
| 3423 | + | |
| 3424 | +</div> | |
| 3425 | + | |
| 3426 | + <script> | |
| 3427 | + | |
| 3428 | + /** | |
| 3429 | + * clickEventDownloadHandler() | |
| 3430 | + * Is used to handle download image action selected as an opening mode | |
| 3431 | + * | |
| 3432 | + */ | |
| 3433 | + | |
| 3434 | + var firstDownload = true; | |
| 3435 | + | |
| 3436 | + function clickEventDownloadHandler() { | |
| 3437 | + | |
| 3438 | + var link = this; | |
| 3439 | + var filename = link.dataset.linkpath; | |
| 3440 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 3441 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 3442 | + | |
| 3443 | + if (newFile) { | |
| 3444 | + | |
| 3445 | + if (firstDownload) { | |
| 3446 | + firstDownload = false; | |
| 3447 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 3448 | + } else { | |
| 3449 | + this.href = link.href; | |
| 3450 | + } | |
| 3451 | + | |
| 3452 | + this.download = fn; | |
| 3453 | + | |
| 3454 | + } else { | |
| 3455 | + this.download = fn + ".html"; | |
| 3456 | + } | |
| 3457 | + } | |
| 3458 | + | |
| 3459 | + </script></div> | |
| 3460 | + | |
| 3461 | +</div> | |
| 3462 | + | |
| 3463 | +</div> | |
| 3464 | + | |
| 3465 | + | |
| 3466 | + | |
| 3467 | +<!--/* Initialize Js */--> | |
| 3468 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156/parsys/columns/parsys2/panelcontainer"> | |
| 3469 | + if(""){ | |
| 3470 | + new Websites.Sticky({ | |
| 3471 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156/parsys/columns/parsys2/panelcontainer", | |
| 3472 | + breakpoint: { | |
| 3473 | + lg: { | |
| 3474 | + to: "" | |
| 3475 | + }, | |
| 3476 | + md: { | |
| 3477 | + to: "" | |
| 3478 | + }, | |
| 3479 | + sm: { | |
| 3480 | + to: "", | |
| 3481 | + }, | |
| 3482 | + xs: { | |
| 3483 | + to: "" | |
| 3484 | + } | |
| 3485 | + } | |
| 3486 | + }); | |
| 3487 | + } | |
| 3488 | +</script> | |
| 3489 | + | |
| 3490 | +</div> | |
| 3491 | +</div> | |
| 3492 | + | |
| 3493 | +</div> | |
| 3494 | + | |
| 3495 | + </div> | |
| 3496 | + | |
| 3497 | + </div> | |
| 3498 | + | |
| 3499 | + | |
| 3500 | + | |
| 3501 | +</div> | |
| 3502 | + | |
| 3503 | +</div> | |
| 3504 | + | |
| 3505 | +</div> | |
| 3506 | + | |
| 3507 | + | |
| 3508 | + | |
| 3509 | +<!--/* Initialize Js */--> | |
| 3510 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156"> | |
| 3511 | + if(""){ | |
| 3512 | + new Websites.Sticky({ | |
| 3513 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_/parsys/panelcontainer_1021323156", | |
| 3514 | + breakpoint: { | |
| 3515 | + lg: { | |
| 3516 | + to: "none" | |
| 3517 | + }, | |
| 3518 | + md: { | |
| 3519 | + to: "none" | |
| 3520 | + }, | |
| 3521 | + sm: { | |
| 3522 | + to: "none", | |
| 3523 | + }, | |
| 3524 | + xs: { | |
| 3525 | + to: "none" | |
| 3526 | + } | |
| 3527 | + } | |
| 3528 | + }); | |
| 3529 | + } | |
| 3530 | +</script> | |
| 3531 | + | |
| 3532 | +</div> | |
| 3533 | +</div> | |
| 3534 | + | |
| 3535 | +</div> | |
| 3536 | + | |
| 3537 | +</div> | |
| 3538 | + | |
| 3539 | + | |
| 3540 | + | |
| 3541 | +<!--/* Initialize Js */--> | |
| 3542 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_"> | |
| 3543 | + if(""){ | |
| 3544 | + new Websites.Sticky({ | |
| 3545 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy/parsys/columns_copy_copy_co/parsys3/panelcontainer_copy_", | |
| 3546 | + breakpoint: { | |
| 3547 | + lg: { | |
| 3548 | + to: "none" | |
| 3549 | + }, | |
| 3550 | + md: { | |
| 3551 | + to: "none" | |
| 3552 | + }, | |
| 3553 | + sm: { | |
| 3554 | + to: "none", | |
| 3555 | + }, | |
| 3556 | + xs: { | |
| 3557 | + to: "none" | |
| 3558 | + } | |
| 3559 | + } | |
| 3560 | + }); | |
| 3561 | + } | |
| 3562 | +</script> | |
| 3563 | + | |
| 3564 | +</div> | |
| 3565 | +</div> | |
| 3566 | + | |
| 3567 | +</div> | |
| 3568 | + | |
| 3569 | + </div> | |
| 3570 | + | |
| 3571 | + </div> | |
| 3572 | + | |
| 3573 | + | |
| 3574 | + | |
| 3575 | +</div> | |
| 3576 | + | |
| 3577 | +</div> | |
| 3578 | + | |
| 3579 | +</div> | |
| 3580 | + | |
| 3581 | + | |
| 3582 | + | |
| 3583 | +<!--/* Initialize Js */--> | |
| 3584 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy"> | |
| 3585 | + if(""){ | |
| 3586 | + new Websites.Sticky({ | |
| 3587 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/panelcontainer_copy", | |
| 3588 | + breakpoint: { | |
| 3589 | + lg: { | |
| 3590 | + to: "" | |
| 3591 | + }, | |
| 3592 | + md: { | |
| 3593 | + to: "" | |
| 3594 | + }, | |
| 3595 | + sm: { | |
| 3596 | + to: "", | |
| 3597 | + }, | |
| 3598 | + xs: { | |
| 3599 | + to: "" | |
| 3600 | + } | |
| 3601 | + } | |
| 3602 | + }); | |
| 3603 | + } | |
| 3604 | +</script> | |
| 3605 | + | |
| 3606 | +</div> | |
| 3607 | +</div> | |
| 3608 | +<div class="textandimage parbase section"> | |
| 3609 | + | |
| 3610 | + | |
| 3611 | + | |
| 3612 | + | |
| 3613 | + | |
| 3614 | + | |
| 3615 | + | |
| 3616 | + | |
| 3617 | + | |
| 3618 | + | |
| 3619 | + | |
| 3620 | + | |
| 3621 | + | |
| 3622 | + | |
| 3623 | + | |
| 3624 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_textandimage_copy_co" class="text-image-container " | |
| 3625 | + data-text-image-container-right-left="false"> | |
| 3626 | + | |
| 3627 | + | |
| 3628 | + | |
| 3629 | + | |
| 3630 | + | |
| 3631 | + | |
| 3632 | + | |
| 3633 | + | |
| 3634 | + | |
| 3635 | + <div class="row text-image-row" | |
| 3636 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 3637 | + | |
| 3638 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 3639 | + | |
| 3640 | + | |
| 3641 | + | |
| 3642 | + | |
| 3643 | + | |
| 3644 | + data-text-image-rowcontainer-height-lg="0" | |
| 3645 | + data-text-image-rowcontainer-width-lg="0" | |
| 3646 | + data-text-image-rowcontainer-class-lg="" | |
| 3647 | + | |
| 3648 | + data-text-image-rowcontainer-bg-type-md="" | |
| 3649 | + | |
| 3650 | + | |
| 3651 | + | |
| 3652 | + | |
| 3653 | + | |
| 3654 | + data-text-image-rowcontainer-height-md="0" | |
| 3655 | + data-text-image-rowcontainer-width-md="0" | |
| 3656 | + data-text-image-rowcontainer-class-md="" | |
| 3657 | + | |
| 3658 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 3659 | + | |
| 3660 | + | |
| 3661 | + | |
| 3662 | + | |
| 3663 | + | |
| 3664 | + data-text-image-rowcontainer-height-sm="0" | |
| 3665 | + data-text-image-rowcontainer-width-sm="0" | |
| 3666 | + data-text-image-rowcontainer-class-sm="" | |
| 3667 | + | |
| 3668 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 3669 | + | |
| 3670 | + | |
| 3671 | + | |
| 3672 | + | |
| 3673 | + | |
| 3674 | + data-text-image-rowcontainer-height-xs="0" | |
| 3675 | + data-text-image-rowcontainer-width-xs="0" | |
| 3676 | + data-text-image-rowcontainer-class-xs=""> | |
| 3677 | + | |
| 3678 | + <div class="col-xs-12 text-image-text-container " ><h3 class="h3variant3">Other promotional rates<br> | |
| 3679 | +</h3> | |
| 3680 | +</div> | |
| 3681 | + </div> | |
| 3682 | + | |
| 3683 | + | |
| 3684 | + | |
| 3685 | + | |
| 3686 | + | |
| 3687 | + | |
| 3688 | + | |
| 3689 | + | |
| 3690 | + | |
| 3691 | + | |
| 3692 | + | |
| 3693 | + <script> | |
| 3694 | + | |
| 3695 | + (function(){ | |
| 3696 | + | |
| 3697 | + var dataLayerViewEventName = '' || ''; | |
| 3698 | + var dataLayerViewLayerProperties = []; | |
| 3699 | + var $el; | |
| 3700 | + | |
| 3701 | + | |
| 3702 | + | |
| 3703 | + if(dataLayerViewEventName.trim().length) { | |
| 3704 | + | |
| 3705 | + var obj = { | |
| 3706 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 3707 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_textandimage_copy_co" , | |
| 3708 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 3709 | + }; | |
| 3710 | + | |
| 3711 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 3712 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 3713 | + if(document.currentScript){ | |
| 3714 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 3715 | + } else { | |
| 3716 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 3717 | + var currentScript = scripts[scripts.length - 1]; | |
| 3718 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 3719 | + } | |
| 3720 | + | |
| 3721 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 3722 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 3723 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 3724 | + | |
| 3725 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 3726 | + | |
| 3727 | + } | |
| 3728 | + | |
| 3729 | + })(); | |
| 3730 | + | |
| 3731 | + </script> | |
| 3732 | + | |
| 3733 | +</div> | |
| 3734 | + | |
| 3735 | + <script> | |
| 3736 | + | |
| 3737 | + /** | |
| 3738 | + * clickEventDownloadHandler() | |
| 3739 | + * Is used to handle download image action selected as an opening mode | |
| 3740 | + * | |
| 3741 | + */ | |
| 3742 | + | |
| 3743 | + var firstDownload = true; | |
| 3744 | + | |
| 3745 | + function clickEventDownloadHandler() { | |
| 3746 | + | |
| 3747 | + var link = this; | |
| 3748 | + var filename = link.dataset.linkpath; | |
| 3749 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 3750 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 3751 | + | |
| 3752 | + if (newFile) { | |
| 3753 | + | |
| 3754 | + if (firstDownload) { | |
| 3755 | + firstDownload = false; | |
| 3756 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 3757 | + } else { | |
| 3758 | + this.href = link.href; | |
| 3759 | + } | |
| 3760 | + | |
| 3761 | + this.download = fn; | |
| 3762 | + | |
| 3763 | + } else { | |
| 3764 | + this.download = fn + ".html"; | |
| 3765 | + } | |
| 3766 | + } | |
| 3767 | + | |
| 3768 | + </script></div> | |
| 3769 | +<div class="table parbase section"> | |
| 3770 | + | |
| 3771 | + | |
| 3772 | + | |
| 3773 | +<script src="/etc.clientlibs/web-sites/components/table/clientlibs/site.min.3e37d1187a23edb74eb7c7bd2e36c4e6.js"></script> | |
| 3774 | + | |
| 3775 | + | |
| 3776 | + | |
| 3777 | + | |
| 3778 | +<div class="table-container"> | |
| 3779 | + <table class="bncr-table bncr-table-mobile" width="100%" cellspacing="0" cellpadding="1" border="1"> | |
| 3780 | + <tbody> | |
| 3781 | + <tr class="no-border"> | |
| 3782 | + <th style="text-align: center; width: 50.0%;" class="separator">Term<br></th> | |
| 3783 | + <th style="text-align: center; width: 25.0%;" class="separator">Interest rate</th> | |
| 3784 | + <th style="text-align: center; width: 25.0%;" class="separator">APR<sup><a hrefnoextension="false" href="#notes-item-4f8cde8ad8" target="_self">2</a></sup></th> | |
| 3785 | + </tr> | |
| 3786 | + <tr> | |
| 3787 | + <td><p style="margin-left: 40.0px;"><b>1 year </b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup><br></p></td> | |
| 3788 | + <td><p class="chapeau3" style="text-align: center;">5.49%<br></p></td> | |
| 3789 | + <td><p class="chapeau3" style="text-align: center;">5.61%<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td> | |
| 3790 | + </tr> | |
| 3791 | + <tr> | |
| 3792 | + <td><p style="margin-left: 40.0px;"><b>2 year </b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p></td> | |
| 3793 | + <td><p class="chapeau3" style="text-align: center;">4.84%<br></p></td> | |
| 3794 | + <td><p class="chapeau3" style="text-align: center;">4.91%<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td> | |
| 3795 | + </tr> | |
| 3796 | + <tr> | |
| 3797 | + <td><p style="margin-left: 40.0px;"><b>3 year </b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p></td> | |
| 3798 | + <td><p class="chapeau3" style="text-align: center;"><span static-token='tauxPromo3ansF|percent:"true"'>${p1.tauxPromo3ansF|percent:"true"}</span><br></p></td> | |
| 3799 | + <td><p class="chapeau3" style="text-align: center;"><span static-token='tac3ans|percent:"true"'>${p1.tac3ans|percent:"true"}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td> | |
| 3800 | + </tr> | |
| 3801 | + <tr> | |
| 3802 | + <td><p style="margin-left: 40.0px;"><b>4 year </b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p></td> | |
| 3803 | + <td><p class="chapeau3" style="text-align: center;"><span static-token='tauxPromo4ansF|percent:"true"'>${p1.tauxPromo4ansF|percent:"true"}</span><br></p></td> | |
| 3804 | + <td><p class="chapeau3" style="text-align: center;"><span static-token='tac4ans|percent:"true"'>${p1.tac4ans|percent:"true"}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td> | |
| 3805 | + </tr> | |
| 3806 | + <tr> | |
| 3807 | + <td><p style="margin-left: 40.0px;"><b>7 year </b>fixed rate<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">1</a></sup></p></td> | |
| 3808 | + <td><p class="chapeau3" style="text-align: center;">5.26%<br></p></td> | |
| 3809 | + <td><p class="chapeau3" style="text-align: center;">5.29%<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">**</a></p></td> | |
| 3810 | + </tr> | |
| 3811 | + </tbody> | |
| 3812 | +</table> | |
| 3813 | + | |
| 3814 | + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span> | |
| 3815 | + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span> | |
| 3816 | + <div class="table-carousel-dots"></div> | |
| 3817 | +</div> | |
| 3818 | + | |
| 3819 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/table_copy_copy_copy"> | |
| 3820 | + new Websites.TableStatic({ | |
| 3821 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer/parsys/table_copy_copy_copy", | |
| 3822 | + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')), | |
| 3823 | + capsuleAlias: "c1", | |
| 3824 | + staticHeader: !!(""), // use !! to convert to boolean | |
| 3825 | + carousel: !!(""), | |
| 3826 | + transposition: !!(""), | |
| 3827 | + customId: "" | |
| 3828 | + }); | |
| 3829 | +</script> | |
| 3830 | +</div> | |
| 3831 | +<div class="textandimage parbase section"> | |
| 3832 | + | |
| 3833 | + | |
| 3834 | + | |
| 3835 | + | |
| 3836 | + | |
| 3837 | + | |
| 3838 | + | |
| 3839 | + | |
| 3840 | + | |
| 3841 | + | |
| 3842 | + | |
| 3843 | + | |
| 3844 | + | |
| 3845 | + | |
| 3846 | + | |
| 3847 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_textandimage_310874312" class="text-image-container " | |
| 3848 | + data-text-image-container-right-left="false"> | |
| 3849 | + | |
| 3850 | + | |
| 3851 | + | |
| 3852 | + | |
| 3853 | + | |
| 3854 | + | |
| 3855 | + | |
| 3856 | + | |
| 3857 | + | |
| 3858 | + <div class="row text-image-row" | |
| 3859 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 3860 | + | |
| 3861 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 3862 | + | |
| 3863 | + | |
| 3864 | + | |
| 3865 | + | |
| 3866 | + | |
| 3867 | + data-text-image-rowcontainer-height-lg="0" | |
| 3868 | + data-text-image-rowcontainer-width-lg="0" | |
| 3869 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 3870 | + | |
| 3871 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 3872 | + | |
| 3873 | + | |
| 3874 | + | |
| 3875 | + | |
| 3876 | + | |
| 3877 | + data-text-image-rowcontainer-height-md="0" | |
| 3878 | + data-text-image-rowcontainer-width-md="0" | |
| 3879 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 3880 | + | |
| 3881 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 3882 | + | |
| 3883 | + | |
| 3884 | + | |
| 3885 | + | |
| 3886 | + | |
| 3887 | + data-text-image-rowcontainer-height-sm="0" | |
| 3888 | + data-text-image-rowcontainer-width-sm="0" | |
| 3889 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 3890 | + | |
| 3891 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 3892 | + | |
| 3893 | + | |
| 3894 | + | |
| 3895 | + | |
| 3896 | + | |
| 3897 | + data-text-image-rowcontainer-height-xs="0" | |
| 3898 | + data-text-image-rowcontainer-width-xs="0" | |
| 3899 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 3900 | + | |
| 3901 | + <div class="col-xs-12 text-image-text-container | |
| 3902 | + initializing" ><p class="pvariant3"><b><br> | |
| 3903 | + Rate (%) as at <span static-token='tauxDateJour|date:"-"'>${p1.tauxDateJour|date:"-"}</span></b></p></div> | |
| 3904 | + </div> | |
| 3905 | + | |
| 3906 | + | |
| 3907 | + | |
| 3908 | + | |
| 3909 | + | |
| 3910 | + | |
| 3911 | + | |
| 3912 | + | |
| 3913 | + | |
| 3914 | + | |
| 3915 | + | |
| 3916 | + | |
| 3917 | + <script> | |
| 3918 | + (function(){ | |
| 3919 | + var $el; | |
| 3920 | + var listeners = []; | |
| 3921 | + var dataLayerViewEventName = ''; | |
| 3922 | + var dataLayerViewLayerProperties = []; | |
| 3923 | + | |
| 3924 | + dataLayerViewEventName = ''; | |
| 3925 | + | |
| 3926 | + | |
| 3927 | + | |
| 3928 | + | |
| 3929 | + | |
| 3930 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 3931 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 3932 | + if(document.currentScript){ | |
| 3933 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 3934 | + } else { | |
| 3935 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 3936 | + var currentScript = scripts[scripts.length - 1]; | |
| 3937 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 3938 | + } | |
| 3939 | + | |
| 3940 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 3941 | + Websites.Product.TextContent.initTextContent({ | |
| 3942 | + $el: $el, | |
| 3943 | + capsuleAlias: "c1", | |
| 3944 | + listeners: listeners, | |
| 3945 | + products: Websites.Product.Core.determineProductsArray("c1"), | |
| 3946 | + dataLayerViewEvent: { | |
| 3947 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 3948 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_parsys_textandimage_310874312" , | |
| 3949 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 3950 | + } | |
| 3951 | + }); | |
| 3952 | + }); | |
| 3953 | + })(); | |
| 3954 | + | |
| 3955 | + </script> | |
| 3956 | + | |
| 3957 | + | |
| 3958 | + | |
| 3959 | + | |
| 3960 | + | |
| 3961 | +</div> | |
| 3962 | + | |
| 3963 | + <script> | |
| 3964 | + | |
| 3965 | + /** | |
| 3966 | + * clickEventDownloadHandler() | |
| 3967 | + * Is used to handle download image action selected as an opening mode | |
| 3968 | + * | |
| 3969 | + */ | |
| 3970 | + | |
| 3971 | + var firstDownload = true; | |
| 3972 | + | |
| 3973 | + function clickEventDownloadHandler() { | |
| 3974 | + | |
| 3975 | + var link = this; | |
| 3976 | + var filename = link.dataset.linkpath; | |
| 3977 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 3978 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 3979 | + | |
| 3980 | + if (newFile) { | |
| 3981 | + | |
| 3982 | + if (firstDownload) { | |
| 3983 | + firstDownload = false; | |
| 3984 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 3985 | + } else { | |
| 3986 | + this.href = link.href; | |
| 3987 | + } | |
| 3988 | + | |
| 3989 | + this.download = fn; | |
| 3990 | + | |
| 3991 | + } else { | |
| 3992 | + this.download = fn + ".html"; | |
| 3993 | + } | |
| 3994 | + } | |
| 3995 | + | |
| 3996 | + </script></div> | |
| 3997 | + | |
| 3998 | +</div> | |
| 3999 | + | |
| 4000 | +</div> | |
| 4001 | + | |
| 4002 | + | |
| 4003 | + | |
| 4004 | +<!--/* Initialize Js */--> | |
| 4005 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer"> | |
| 4006 | + if(""){ | |
| 4007 | + new Websites.Sticky({ | |
| 4008 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer", | |
| 4009 | + breakpoint: { | |
| 4010 | + lg: { | |
| 4011 | + to: "" | |
| 4012 | + }, | |
| 4013 | + md: { | |
| 4014 | + to: "" | |
| 4015 | + }, | |
| 4016 | + sm: { | |
| 4017 | + to: "none", | |
| 4018 | + }, | |
| 4019 | + xs: { | |
| 4020 | + to: "none" | |
| 4021 | + } | |
| 4022 | + } | |
| 4023 | + }); | |
| 4024 | + } | |
| 4025 | +</script> | |
| 4026 | + | |
| 4027 | +</div> | |
| 4028 | +</div> | |
| 4029 | +<div class="panelContainer section"> | |
| 4030 | + | |
| 4031 | + | |
| 4032 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 4033 | + | |
| 4034 | + | |
| 4035 | + | |
| 4036 | + <div> | |
| 4037 | + | |
| 4038 | + | |
| 4039 | + | |
| 4040 | + | |
| 4041 | + | |
| 4042 | + | |
| 4043 | + | |
| 4044 | + | |
| 4045 | + | |
| 4046 | + | |
| 4047 | + | |
| 4048 | + | |
| 4049 | + | |
| 4050 | + | |
| 4051 | + | |
| 4052 | + | |
| 4053 | + | |
| 4054 | + | |
| 4055 | + | |
| 4056 | + | |
| 4057 | + | |
| 4058 | + | |
| 4059 | + | |
| 4060 | +<div class="panelContainer background-tertiary-lightGrey panel-border-radius " | |
| 4061 | + | |
| 4062 | + | |
| 4063 | + data-websites-component="/components/panelContainer.v1" | |
| 4064 | + data-panel-container-lg-mg="" | |
| 4065 | + data-panel-container-lg-pd="" | |
| 4066 | + data-panel-container-lg-ht="" | |
| 4067 | + data-panel-container-md-mg="" | |
| 4068 | + data-panel-container-md-pd="" | |
| 4069 | + data-panel-container-md-ht="" | |
| 4070 | + data-panel-container-sm-mg="" | |
| 4071 | + data-panel-container-sm-pd="" | |
| 4072 | + data-panel-container-sm-ht="" | |
| 4073 | + data-panel-container-xs-mg="" | |
| 4074 | + data-panel-container-xs-pd="" | |
| 4075 | + data-panel-container-xs-ht="" | |
| 4076 | + data-panel-container-limit=""> | |
| 4077 | + <div class="parsys"><div class="columns parbase section"> | |
| 4078 | + | |
| 4079 | + | |
| 4080 | + | |
| 4081 | + | |
| 4082 | +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div> | |
| 4083 | + | |
| 4084 | + | |
| 4085 | + | |
| 4086 | + | |
| 4087 | + | |
| 4088 | + | |
| 4089 | + | |
| 4090 | + | |
| 4091 | + | |
| 4092 | + | |
| 4093 | + | |
| 4094 | + | |
| 4095 | + | |
| 4096 | + <div style="" | |
| 4097 | + class="columns-row row row-eq-height" | |
| 4098 | + | |
| 4099 | + data-style-lg="" data-height-lg="" | |
| 4100 | + data-width-lg="" | |
| 4101 | + data-background-color-lg="" | |
| 4102 | + data-background-color-xs=""> | |
| 4103 | + <div style="" | |
| 4104 | + class="col-xs-12 col-sm-12 columns-title " | |
| 4105 | + data-height="" data-width="" | |
| 4106 | + data-style-xs="" data-height-xs="" | |
| 4107 | + data-width-xs=""> | |
| 4108 | + | |
| 4109 | + </div> | |
| 4110 | + | |
| 4111 | + | |
| 4112 | + | |
| 4113 | + | |
| 4114 | + <div class="col-xs-12 col-sm-4 column col-first "> | |
| 4115 | + <div class="parsys1 parsys"><div class="panelContainer section"> | |
| 4116 | + | |
| 4117 | + | |
| 4118 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 4119 | + | |
| 4120 | + | |
| 4121 | + | |
| 4122 | + <div> | |
| 4123 | + | |
| 4124 | + | |
| 4125 | + | |
| 4126 | + | |
| 4127 | + | |
| 4128 | + | |
| 4129 | + | |
| 4130 | + | |
| 4131 | + | |
| 4132 | + | |
| 4133 | + | |
| 4134 | + | |
| 4135 | + | |
| 4136 | + | |
| 4137 | + | |
| 4138 | + | |
| 4139 | + | |
| 4140 | + | |
| 4141 | + | |
| 4142 | + | |
| 4143 | + | |
| 4144 | + | |
| 4145 | + | |
| 4146 | +<div class="panelContainer background-secondary-white " | |
| 4147 | + | |
| 4148 | + | |
| 4149 | + data-websites-component="/components/panelContainer.v1" | |
| 4150 | + data-panel-container-lg-mg="" | |
| 4151 | + data-panel-container-lg-pd="0px 0px 10px 0px" | |
| 4152 | + data-panel-container-lg-ht="" | |
| 4153 | + data-panel-container-md-mg="" | |
| 4154 | + data-panel-container-md-pd="0px 0px 40px 0px" | |
| 4155 | + data-panel-container-md-ht="" | |
| 4156 | + data-panel-container-sm-mg="" | |
| 4157 | + data-panel-container-sm-pd="" | |
| 4158 | + data-panel-container-sm-ht="320px" | |
| 4159 | + data-panel-container-xs-mg="" | |
| 4160 | + data-panel-container-xs-pd="" | |
| 4161 | + data-panel-container-xs-ht="" | |
| 4162 | + data-panel-container-limit=""> | |
| 4163 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 4164 | + | |
| 4165 | + | |
| 4166 | + | |
| 4167 | + | |
| 4168 | + | |
| 4169 | + | |
| 4170 | + | |
| 4171 | + | |
| 4172 | + | |
| 4173 | + | |
| 4174 | + | |
| 4175 | + | |
| 4176 | + | |
| 4177 | + | |
| 4178 | + | |
| 4179 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_copy__parsys_columns_parsys1_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 4180 | + data-text-image-container-right-left="false"> | |
| 4181 | + | |
| 4182 | + | |
| 4183 | + | |
| 4184 | + | |
| 4185 | + | |
| 4186 | + | |
| 4187 | + | |
| 4188 | + | |
| 4189 | + | |
| 4190 | + <div class="row text-image-row" | |
| 4191 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 4192 | + | |
| 4193 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 4194 | + | |
| 4195 | + | |
| 4196 | + | |
| 4197 | + | |
| 4198 | + | |
| 4199 | + data-text-image-rowcontainer-height-lg="0" | |
| 4200 | + data-text-image-rowcontainer-width-lg="0" | |
| 4201 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 4202 | + | |
| 4203 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 4204 | + | |
| 4205 | + | |
| 4206 | + | |
| 4207 | + | |
| 4208 | + | |
| 4209 | + data-text-image-rowcontainer-height-md="0" | |
| 4210 | + data-text-image-rowcontainer-width-md="0" | |
| 4211 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 4212 | + | |
| 4213 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 4214 | + | |
| 4215 | + | |
| 4216 | + | |
| 4217 | + | |
| 4218 | + | |
| 4219 | + data-text-image-rowcontainer-height-sm="0" | |
| 4220 | + data-text-image-rowcontainer-width-sm="0" | |
| 4221 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 4222 | + | |
| 4223 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 4224 | + | |
| 4225 | + | |
| 4226 | + | |
| 4227 | + | |
| 4228 | + | |
| 4229 | + data-text-image-rowcontainer-height-xs="0" | |
| 4230 | + data-text-image-rowcontainer-width-xs="0" | |
| 4231 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 4232 | + | |
| 4233 | + | |
| 4234 | + | |
| 4235 | + | |
| 4236 | + | |
| 4237 | + | |
| 4238 | + | |
| 4239 | + | |
| 4240 | + | |
| 4241 | + | |
| 4242 | + | |
| 4243 | + | |
| 4244 | + | |
| 4245 | + | |
| 4246 | + <div class="col-xs-12 text-image-image-container" > | |
| 4247 | + | |
| 4248 | + | |
| 4249 | + | |
| 4250 | + <div> | |
| 4251 | + | |
| 4252 | + | |
| 4253 | + | |
| 4254 | + | |
| 4255 | + | |
| 4256 | + | |
| 4257 | + <picture> | |
| 4258 | + | |
| 4259 | + | |
| 4260 | + | |
| 4261 | + | |
| 4262 | + | |
| 4263 | + | |
| 4264 | + | |
| 4265 | + | |
| 4266 | + | |
| 4267 | + | |
| 4268 | + | |
| 4269 | + | |
| 4270 | + | |
| 4271 | + <source srcset="/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png" media="(max-width: 767px)"> | |
| 4272 | + | |
| 4273 | + | |
| 4274 | + | |
| 4275 | + | |
| 4276 | + | |
| 4277 | + | |
| 4278 | + | |
| 4279 | + | |
| 4280 | + | |
| 4281 | + | |
| 4282 | + | |
| 4283 | + | |
| 4284 | + | |
| 4285 | + | |
| 4286 | + | |
| 4287 | + | |
| 4288 | + | |
| 4289 | + | |
| 4290 | + | |
| 4291 | + | |
| 4292 | + | |
| 4293 | + | |
| 4294 | + | |
| 4295 | + | |
| 4296 | + <source srcset="/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png" media="(max-width: 991px)"> | |
| 4297 | + | |
| 4298 | + | |
| 4299 | + | |
| 4300 | + | |
| 4301 | + | |
| 4302 | + | |
| 4303 | + | |
| 4304 | + | |
| 4305 | + | |
| 4306 | + | |
| 4307 | + | |
| 4308 | + | |
| 4309 | + | |
| 4310 | + | |
| 4311 | + | |
| 4312 | + | |
| 4313 | + | |
| 4314 | + | |
| 4315 | + | |
| 4316 | + | |
| 4317 | + | |
| 4318 | + | |
| 4319 | + | |
| 4320 | + | |
| 4321 | + <source srcset="/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png" media="(max-width: 1199px)"> | |
| 4322 | + | |
| 4323 | + | |
| 4324 | + | |
| 4325 | + | |
| 4326 | + | |
| 4327 | + | |
| 4328 | + | |
| 4329 | + | |
| 4330 | + | |
| 4331 | + | |
| 4332 | + | |
| 4333 | + | |
| 4334 | + | |
| 4335 | + | |
| 4336 | + <source srcset="/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png" media="(min-width: 1200px)"> | |
| 4337 | + | |
| 4338 | + | |
| 4339 | + | |
| 4340 | + | |
| 4341 | + <img src='/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png' srcset='/content/dam/bnc/particuliers/img/img-maillage-bandeau-offre-duo.png' data-websites-component="/components/textandimage/image" alt="" data-picture-alttext-lg="" data-picture-alttext-md="" data-picture-alttext-sm="" data-picture-alttext-xs="" class="center-block image-responsive"> | |
| 4342 | + </picture> | |
| 4343 | + | |
| 4344 | + | |
| 4345 | + | |
| 4346 | + <script type="text/javascript"> | |
| 4347 | + | |
| 4348 | + var Websites = Websites || {}; | |
| 4349 | + Websites.FragmentPicture = Websites.FragmentPicture || { | |
| 4350 | + init: function(viewport) { | |
| 4351 | + Websites.FragmentPicture.loadAlternativeText(viewport); | |
| 4352 | + }, | |
| 4353 | + | |
| 4354 | + loadAlternativeText: function(viewport) { | |
| 4355 | + $('[data-websites-component="/components/textandimage/image"]').each(function(){ | |
| 4356 | + if(viewport.is("xs") ) { | |
| 4357 | + $(this).attr("alt", $(this).data("picture-alttext-xs")); | |
| 4358 | + } else if(viewport.is("sm") ) { | |
| 4359 | + $(this).attr("alt", $(this).data("picture-alttext-sm")); | |
| 4360 | + } else if(viewport.is("md") ) { | |
| 4361 | + $(this).attr("alt", $(this).data("picture-alttext-md")); | |
| 4362 | + } else if(viewport.is("lg") ) { | |
| 4363 | + $(this).attr("alt", $(this).data("picture-alttext-lg")); | |
| 4364 | + } | |
| 4365 | + }); | |
| 4366 | + } | |
| 4367 | + }; | |
| 4368 | + | |
| 4369 | + $(document).ready(function(){ | |
| 4370 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 4371 | + }); | |
| 4372 | + | |
| 4373 | + Websites.Events.onBreakpointChanged(function(){ | |
| 4374 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 4375 | + }); | |
| 4376 | + </script> | |
| 4377 | + | |
| 4378 | + | |
| 4379 | + | |
| 4380 | + | |
| 4381 | + | |
| 4382 | + </div> | |
| 4383 | + | |
| 4384 | + | |
| 4385 | + | |
| 4386 | +</div> | |
| 4387 | +<div | |
| 4388 | + class="col-xs-12 text-image-text-container " | |
| 4389 | + | |
| 4390 | + data-websites-component="/components/textandimage/text" | |
| 4391 | + data-text-image-text-container-style-xs="{'padding-top': '0px'}" | |
| 4392 | + data-text-image-text-container-style-sm="{'padding-top': '0px'}" | |
| 4393 | + data-text-image-text-container-style-md="{'padding-top': '0px'}" | |
| 4394 | + data-text-image-text-container-style-lg="{'padding-top': '0px'}"></div> | |
| 4395 | + | |
| 4396 | + | |
| 4397 | + | |
| 4398 | + | |
| 4399 | + | |
| 4400 | + | |
| 4401 | + | |
| 4402 | + | |
| 4403 | + | |
| 4404 | + </div> | |
| 4405 | + | |
| 4406 | + | |
| 4407 | + | |
| 4408 | + | |
| 4409 | + | |
| 4410 | + | |
| 4411 | + | |
| 4412 | + | |
| 4413 | + | |
| 4414 | + | |
| 4415 | + | |
| 4416 | + | |
| 4417 | + <script> | |
| 4418 | + | |
| 4419 | + (function(){ | |
| 4420 | + | |
| 4421 | + var dataLayerViewEventName = '' || ''; | |
| 4422 | + var dataLayerViewLayerProperties = []; | |
| 4423 | + var $el; | |
| 4424 | + | |
| 4425 | + | |
| 4426 | + | |
| 4427 | + if(dataLayerViewEventName.trim().length) { | |
| 4428 | + | |
| 4429 | + var obj = { | |
| 4430 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 4431 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_copy__parsys_columns_parsys1_panelcontainer_parsys_textandimage" , | |
| 4432 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 4433 | + }; | |
| 4434 | + | |
| 4435 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 4436 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 4437 | + if(document.currentScript){ | |
| 4438 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 4439 | + } else { | |
| 4440 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 4441 | + var currentScript = scripts[scripts.length - 1]; | |
| 4442 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 4443 | + } | |
| 4444 | + | |
| 4445 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 4446 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 4447 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 4448 | + | |
| 4449 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 4450 | + | |
| 4451 | + } | |
| 4452 | + | |
| 4453 | + })(); | |
| 4454 | + | |
| 4455 | + </script> | |
| 4456 | + | |
| 4457 | +</div> | |
| 4458 | + | |
| 4459 | + <script> | |
| 4460 | + | |
| 4461 | + /** | |
| 4462 | + * clickEventDownloadHandler() | |
| 4463 | + * Is used to handle download image action selected as an opening mode | |
| 4464 | + * | |
| 4465 | + */ | |
| 4466 | + | |
| 4467 | + var firstDownload = true; | |
| 4468 | + | |
| 4469 | + function clickEventDownloadHandler() { | |
| 4470 | + | |
| 4471 | + var link = this; | |
| 4472 | + var filename = link.dataset.linkpath; | |
| 4473 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 4474 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 4475 | + | |
| 4476 | + if (newFile) { | |
| 4477 | + | |
| 4478 | + if (firstDownload) { | |
| 4479 | + firstDownload = false; | |
| 4480 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 4481 | + } else { | |
| 4482 | + this.href = link.href; | |
| 4483 | + } | |
| 4484 | + | |
| 4485 | + this.download = fn; | |
| 4486 | + | |
| 4487 | + } else { | |
| 4488 | + this.download = fn + ".html"; | |
| 4489 | + } | |
| 4490 | + } | |
| 4491 | + | |
| 4492 | + </script></div> | |
| 4493 | + | |
| 4494 | +</div> | |
| 4495 | + | |
| 4496 | +</div> | |
| 4497 | + | |
| 4498 | + | |
| 4499 | + | |
| 4500 | +<!--/* Initialize Js */--> | |
| 4501 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_/parsys/columns/parsys1/panelcontainer"> | |
| 4502 | + if(""){ | |
| 4503 | + new Websites.Sticky({ | |
| 4504 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_/parsys/columns/parsys1/panelcontainer", | |
| 4505 | + breakpoint: { | |
| 4506 | + lg: { | |
| 4507 | + to: "none" | |
| 4508 | + }, | |
| 4509 | + md: { | |
| 4510 | + to: "none" | |
| 4511 | + }, | |
| 4512 | + sm: { | |
| 4513 | + to: "none", | |
| 4514 | + }, | |
| 4515 | + xs: { | |
| 4516 | + to: "none" | |
| 4517 | + } | |
| 4518 | + } | |
| 4519 | + }); | |
| 4520 | + } | |
| 4521 | +</script> | |
| 4522 | + | |
| 4523 | +</div> | |
| 4524 | +</div> | |
| 4525 | + | |
| 4526 | +</div> | |
| 4527 | + | |
| 4528 | + </div> | |
| 4529 | + | |
| 4530 | + <div class="col-xs-12 col-sm-8 column col-last "> | |
| 4531 | + <div class="parsys2 parsys"><div class="panelContainer section"> | |
| 4532 | + | |
| 4533 | + | |
| 4534 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 4535 | + | |
| 4536 | + | |
| 4537 | + | |
| 4538 | + <div> | |
| 4539 | + | |
| 4540 | + | |
| 4541 | + | |
| 4542 | + | |
| 4543 | + | |
| 4544 | + | |
| 4545 | + | |
| 4546 | + | |
| 4547 | + | |
| 4548 | + | |
| 4549 | + | |
| 4550 | + | |
| 4551 | + | |
| 4552 | + | |
| 4553 | + | |
| 4554 | + | |
| 4555 | + | |
| 4556 | + | |
| 4557 | + | |
| 4558 | + | |
| 4559 | + | |
| 4560 | + | |
| 4561 | + | |
| 4562 | +<div class="panelContainer " | |
| 4563 | + | |
| 4564 | + | |
| 4565 | + data-websites-component="/components/panelContainer.v1" | |
| 4566 | + data-panel-container-lg-mg="" | |
| 4567 | + data-panel-container-lg-pd="10px 20px" | |
| 4568 | + data-panel-container-lg-ht="" | |
| 4569 | + data-panel-container-md-mg="" | |
| 4570 | + data-panel-container-md-pd="0px 10px" | |
| 4571 | + data-panel-container-md-ht="" | |
| 4572 | + data-panel-container-sm-mg="" | |
| 4573 | + data-panel-container-sm-pd="10px 20px" | |
| 4574 | + data-panel-container-sm-ht="" | |
| 4575 | + data-panel-container-xs-mg="" | |
| 4576 | + data-panel-container-xs-pd="10px 20px" | |
| 4577 | + data-panel-container-xs-ht="" | |
| 4578 | + data-panel-container-limit=""> | |
| 4579 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 4580 | + | |
| 4581 | + | |
| 4582 | + | |
| 4583 | + | |
| 4584 | + | |
| 4585 | + | |
| 4586 | + | |
| 4587 | + | |
| 4588 | + | |
| 4589 | + | |
| 4590 | + | |
| 4591 | + | |
| 4592 | + | |
| 4593 | + | |
| 4594 | + | |
| 4595 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_copy__parsys_columns_parsys2_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 4596 | + data-text-image-container-right-left="false"> | |
| 4597 | + | |
| 4598 | + | |
| 4599 | + | |
| 4600 | + | |
| 4601 | + | |
| 4602 | + | |
| 4603 | + | |
| 4604 | + | |
| 4605 | + | |
| 4606 | + <div class="row text-image-row" | |
| 4607 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 4608 | + | |
| 4609 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 4610 | + | |
| 4611 | + | |
| 4612 | + | |
| 4613 | + | |
| 4614 | + | |
| 4615 | + data-text-image-rowcontainer-height-lg="0" | |
| 4616 | + data-text-image-rowcontainer-width-lg="0" | |
| 4617 | + data-text-image-rowcontainer-class-lg="" | |
| 4618 | + | |
| 4619 | + data-text-image-rowcontainer-bg-type-md="" | |
| 4620 | + | |
| 4621 | + | |
| 4622 | + | |
| 4623 | + | |
| 4624 | + | |
| 4625 | + data-text-image-rowcontainer-height-md="0" | |
| 4626 | + data-text-image-rowcontainer-width-md="0" | |
| 4627 | + data-text-image-rowcontainer-class-md="" | |
| 4628 | + | |
| 4629 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 4630 | + | |
| 4631 | + | |
| 4632 | + | |
| 4633 | + | |
| 4634 | + | |
| 4635 | + data-text-image-rowcontainer-height-sm="0" | |
| 4636 | + data-text-image-rowcontainer-width-sm="0" | |
| 4637 | + data-text-image-rowcontainer-class-sm="" | |
| 4638 | + | |
| 4639 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 4640 | + | |
| 4641 | + | |
| 4642 | + | |
| 4643 | + | |
| 4644 | + | |
| 4645 | + data-text-image-rowcontainer-height-xs="0" | |
| 4646 | + data-text-image-rowcontainer-width-xs="0" | |
| 4647 | + data-text-image-rowcontainer-class-xs=""> | |
| 4648 | + | |
| 4649 | + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant3" style="text-align: left;"><b>Take advantage of our mortgage offers</b></h2> | |
| 4650 | +<p class="pvariant3" style="text-align: left;">Bundle your mortgage, new investments, and mortgage loan insurance to unlock additional cashback opportunities.*</p> | |
| 4651 | +<p class="pvariant3" style="text-align: left;"><a role="button" tabindex="0" onkeyup="if(event.key === ' ') this.click();" href="/personal/mortgages/offers.html" class="btnRTE3 btn-arrow btn" target="_self" hrefnoextension="false">Discover our offers</a></p> | |
| 4652 | +<p class="legalnotes3" style="text-align: left;">*For a limited time. Conditions and restrictions apply. </p> | |
| 4653 | +</div> | |
| 4654 | + </div> | |
| 4655 | + | |
| 4656 | + | |
| 4657 | + | |
| 4658 | + | |
| 4659 | + | |
| 4660 | + | |
| 4661 | + | |
| 4662 | + | |
| 4663 | + | |
| 4664 | + | |
| 4665 | + | |
| 4666 | + <script> | |
| 4667 | + | |
| 4668 | + (function(){ | |
| 4669 | + | |
| 4670 | + var dataLayerViewEventName = '' || ''; | |
| 4671 | + var dataLayerViewLayerProperties = []; | |
| 4672 | + var $el; | |
| 4673 | + | |
| 4674 | + | |
| 4675 | + | |
| 4676 | + if(dataLayerViewEventName.trim().length) { | |
| 4677 | + | |
| 4678 | + var obj = { | |
| 4679 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 4680 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_801429889_parsys_panelcontainer_copy__parsys_columns_parsys2_panelcontainer_parsys_textandimage" , | |
| 4681 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 4682 | + }; | |
| 4683 | + | |
| 4684 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 4685 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 4686 | + if(document.currentScript){ | |
| 4687 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 4688 | + } else { | |
| 4689 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 4690 | + var currentScript = scripts[scripts.length - 1]; | |
| 4691 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 4692 | + } | |
| 4693 | + | |
| 4694 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 4695 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 4696 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 4697 | + | |
| 4698 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 4699 | + | |
| 4700 | + } | |
| 4701 | + | |
| 4702 | + })(); | |
| 4703 | + | |
| 4704 | + </script> | |
| 4705 | + | |
| 4706 | +</div> | |
| 4707 | + | |
| 4708 | + <script> | |
| 4709 | + | |
| 4710 | + /** | |
| 4711 | + * clickEventDownloadHandler() | |
| 4712 | + * Is used to handle download image action selected as an opening mode | |
| 4713 | + * | |
| 4714 | + */ | |
| 4715 | + | |
| 4716 | + var firstDownload = true; | |
| 4717 | + | |
| 4718 | + function clickEventDownloadHandler() { | |
| 4719 | + | |
| 4720 | + var link = this; | |
| 4721 | + var filename = link.dataset.linkpath; | |
| 4722 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 4723 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 4724 | + | |
| 4725 | + if (newFile) { | |
| 4726 | + | |
| 4727 | + if (firstDownload) { | |
| 4728 | + firstDownload = false; | |
| 4729 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 4730 | + } else { | |
| 4731 | + this.href = link.href; | |
| 4732 | + } | |
| 4733 | + | |
| 4734 | + this.download = fn; | |
| 4735 | + | |
| 4736 | + } else { | |
| 4737 | + this.download = fn + ".html"; | |
| 4738 | + } | |
| 4739 | + } | |
| 4740 | + | |
| 4741 | + </script></div> | |
| 4742 | + | |
| 4743 | +</div> | |
| 4744 | + | |
| 4745 | +</div> | |
| 4746 | + | |
| 4747 | + | |
| 4748 | + | |
| 4749 | +<!--/* Initialize Js */--> | |
| 4750 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_/parsys/columns/parsys2/panelcontainer"> | |
| 4751 | + if(""){ | |
| 4752 | + new Websites.Sticky({ | |
| 4753 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_/parsys/columns/parsys2/panelcontainer", | |
| 4754 | + breakpoint: { | |
| 4755 | + lg: { | |
| 4756 | + to: "none" | |
| 4757 | + }, | |
| 4758 | + md: { | |
| 4759 | + to: "none" | |
| 4760 | + }, | |
| 4761 | + sm: { | |
| 4762 | + to: "none", | |
| 4763 | + }, | |
| 4764 | + xs: { | |
| 4765 | + to: "none" | |
| 4766 | + } | |
| 4767 | + } | |
| 4768 | + }); | |
| 4769 | + } | |
| 4770 | +</script> | |
| 4771 | + | |
| 4772 | +</div> | |
| 4773 | +</div> | |
| 4774 | + | |
| 4775 | +</div> | |
| 4776 | + | |
| 4777 | + </div> | |
| 4778 | + | |
| 4779 | + </div> | |
| 4780 | + | |
| 4781 | + | |
| 4782 | + | |
| 4783 | +</div> | |
| 4784 | + | |
| 4785 | +</div> | |
| 4786 | + | |
| 4787 | +</div> | |
| 4788 | + | |
| 4789 | + | |
| 4790 | + | |
| 4791 | +<!--/* Initialize Js */--> | |
| 4792 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_"> | |
| 4793 | + if(""){ | |
| 4794 | + new Websites.Sticky({ | |
| 4795 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889/parsys/panelcontainer_copy_", | |
| 4796 | + breakpoint: { | |
| 4797 | + lg: { | |
| 4798 | + to: "none" | |
| 4799 | + }, | |
| 4800 | + md: { | |
| 4801 | + to: "none" | |
| 4802 | + }, | |
| 4803 | + sm: { | |
| 4804 | + to: "none", | |
| 4805 | + }, | |
| 4806 | + xs: { | |
| 4807 | + to: "none" | |
| 4808 | + } | |
| 4809 | + } | |
| 4810 | + }); | |
| 4811 | + } | |
| 4812 | +</script> | |
| 4813 | + | |
| 4814 | +</div> | |
| 4815 | +</div> | |
| 4816 | + | |
| 4817 | +</div> | |
| 4818 | + | |
| 4819 | +</div> | |
| 4820 | + | |
| 4821 | + | |
| 4822 | + | |
| 4823 | +<!--/* Initialize Js */--> | |
| 4824 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889"> | |
| 4825 | + if(""){ | |
| 4826 | + new Websites.Sticky({ | |
| 4827 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_801429889", | |
| 4828 | + breakpoint: { | |
| 4829 | + lg: { | |
| 4830 | + to: "" | |
| 4831 | + }, | |
| 4832 | + md: { | |
| 4833 | + to: "" | |
| 4834 | + }, | |
| 4835 | + sm: { | |
| 4836 | + to: "", | |
| 4837 | + }, | |
| 4838 | + xs: { | |
| 4839 | + to: "" | |
| 4840 | + } | |
| 4841 | + } | |
| 4842 | + }); | |
| 4843 | + } | |
| 4844 | +</script> | |
| 4845 | + | |
| 4846 | +</div> | |
| 4847 | +</div> | |
| 4848 | +<div class="panelContainer section"> | |
| 4849 | + | |
| 4850 | + | |
| 4851 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 4852 | + | |
| 4853 | + | |
| 4854 | + | |
| 4855 | + <div> | |
| 4856 | + | |
| 4857 | + | |
| 4858 | + | |
| 4859 | + | |
| 4860 | + | |
| 4861 | + | |
| 4862 | + | |
| 4863 | + | |
| 4864 | + | |
| 4865 | + | |
| 4866 | + | |
| 4867 | + | |
| 4868 | + | |
| 4869 | + | |
| 4870 | + | |
| 4871 | + | |
| 4872 | + | |
| 4873 | + | |
| 4874 | + | |
| 4875 | + | |
| 4876 | + | |
| 4877 | + | |
| 4878 | + | |
| 4879 | +<div class="panelContainer " | |
| 4880 | + | |
| 4881 | + | |
| 4882 | + data-websites-component="/components/panelContainer.v1" | |
| 4883 | + data-panel-container-lg-mg="" | |
| 4884 | + data-panel-container-lg-pd="" | |
| 4885 | + data-panel-container-lg-ht="" | |
| 4886 | + data-panel-container-md-mg="" | |
| 4887 | + data-panel-container-md-pd="" | |
| 4888 | + data-panel-container-md-ht="" | |
| 4889 | + data-panel-container-sm-mg="" | |
| 4890 | + data-panel-container-sm-pd="" | |
| 4891 | + data-panel-container-sm-ht="" | |
| 4892 | + data-panel-container-xs-mg="" | |
| 4893 | + data-panel-container-xs-pd="" | |
| 4894 | + data-panel-container-xs-ht="" | |
| 4895 | + data-panel-container-limit=""> | |
| 4896 | + <div class="parsys"><div class="plainhtmlcode section"> | |
| 4897 | +<div data-emptytext="HTML Component" class="cq-placeholder"></div> | |
| 4898 | +<style> | |
| 4899 | + @media (min-width: 1200px) { | |
| 4900 | + .bncr-banner.promo .text-image-text-container { | |
| 4901 | + margin-top: 35px !important; | |
| 4902 | + | |
| 4903 | + } | |
| 4904 | + | |
| 4905 | + } | |
| 4906 | + @media (max-width: 767px) { | |
| 4907 | +.bncr-banner.promo .chapeau3 { | |
| 4908 | + | |
| 4909 | + text-align: center !important; | |
| 4910 | +} | |
| 4911 | + .bncr-banner.promo .text-image-row { | |
| 4912 | + padding: 0 15px; | |
| 4913 | + | |
| 4914 | + box-shadow: none!important; | |
| 4915 | +height: 380px !important; | |
| 4916 | + background-color: #BBDDE6 !important; | |
| 4917 | + } | |
| 4918 | + | |
| 4919 | + } | |
| 4920 | +@media (min-width: 768px) { | |
| 4921 | +.bncr-banner .text-image-text-container { | |
| 4922 | + margin-top: 25px; | |
| 4923 | +} | |
| 4924 | +} | |
| 4925 | + @media (max-width: 480px) { | |
| 4926 | + .bncr-banner.promo .text-image-text-container { | |
| 4927 | + margin-top: 35px !important; | |
| 4928 | + height: 300px !important; | |
| 4929 | + } | |
| 4930 | + } | |
| 4931 | +</style> | |
| 4932 | +</div> | |
| 4933 | + | |
| 4934 | +</div> | |
| 4935 | + | |
| 4936 | +</div> | |
| 4937 | + | |
| 4938 | + | |
| 4939 | + | |
| 4940 | +<!--/* Initialize Js */--> | |
| 4941 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_copy"> | |
| 4942 | + if(""){ | |
| 4943 | + new Websites.Sticky({ | |
| 4944 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_copy", | |
| 4945 | + breakpoint: { | |
| 4946 | + lg: { | |
| 4947 | + to: "" | |
| 4948 | + }, | |
| 4949 | + md: { | |
| 4950 | + to: "" | |
| 4951 | + }, | |
| 4952 | + sm: { | |
| 4953 | + to: "", | |
| 4954 | + }, | |
| 4955 | + xs: { | |
| 4956 | + to: "" | |
| 4957 | + } | |
| 4958 | + } | |
| 4959 | + }); | |
| 4960 | + } | |
| 4961 | +</script> | |
| 4962 | + | |
| 4963 | +</div> | |
| 4964 | +</div> | |
| 4965 | +<div class="panelContainer section"> | |
| 4966 | + | |
| 4967 | + | |
| 4968 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 4969 | + | |
| 4970 | + | |
| 4971 | + | |
| 4972 | + <div> | |
| 4973 | + | |
| 4974 | + | |
| 4975 | + | |
| 4976 | + | |
| 4977 | + | |
| 4978 | + | |
| 4979 | + | |
| 4980 | + | |
| 4981 | + | |
| 4982 | + | |
| 4983 | + | |
| 4984 | + | |
| 4985 | + | |
| 4986 | + | |
| 4987 | + | |
| 4988 | + | |
| 4989 | + | |
| 4990 | + | |
| 4991 | + | |
| 4992 | + | |
| 4993 | + | |
| 4994 | + | |
| 4995 | + | |
| 4996 | +<div class="panelContainer " | |
| 4997 | + | |
| 4998 | + | |
| 4999 | + data-websites-component="/components/panelContainer.v1" | |
| 5000 | + data-panel-container-lg-mg="" | |
| 5001 | + data-panel-container-lg-pd="" | |
| 5002 | + data-panel-container-lg-ht="" | |
| 5003 | + data-panel-container-md-mg="" | |
| 5004 | + data-panel-container-md-pd="" | |
| 5005 | + data-panel-container-md-ht="" | |
| 5006 | + data-panel-container-sm-mg="" | |
| 5007 | + data-panel-container-sm-pd="" | |
| 5008 | + data-panel-container-sm-ht="" | |
| 5009 | + data-panel-container-xs-mg="" | |
| 5010 | + data-panel-container-xs-pd="" | |
| 5011 | + data-panel-container-xs-ht="" | |
| 5012 | + data-panel-container-limit=""> | |
| 5013 | + <div class="parsys"><div class="panelContainer section"> | |
| 5014 | + | |
| 5015 | + | |
| 5016 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 5017 | + | |
| 5018 | + | |
| 5019 | + | |
| 5020 | + <div> | |
| 5021 | + | |
| 5022 | + | |
| 5023 | + | |
| 5024 | + | |
| 5025 | + | |
| 5026 | + | |
| 5027 | + | |
| 5028 | + | |
| 5029 | + | |
| 5030 | + | |
| 5031 | + | |
| 5032 | + | |
| 5033 | + | |
| 5034 | + | |
| 5035 | + | |
| 5036 | + | |
| 5037 | + | |
| 5038 | + | |
| 5039 | + | |
| 5040 | + | |
| 5041 | + | |
| 5042 | + | |
| 5043 | + | |
| 5044 | +<div class="panelContainer panelContainerStyle2 " | |
| 5045 | + | |
| 5046 | + | |
| 5047 | + data-websites-component="/components/panelContainer.v1" | |
| 5048 | + data-panel-container-lg-mg="" | |
| 5049 | + data-panel-container-lg-pd="" | |
| 5050 | + data-panel-container-lg-ht="" | |
| 5051 | + data-panel-container-md-mg="" | |
| 5052 | + data-panel-container-md-pd="" | |
| 5053 | + data-panel-container-md-ht="" | |
| 5054 | + data-panel-container-sm-mg="" | |
| 5055 | + data-panel-container-sm-pd="" | |
| 5056 | + data-panel-container-sm-ht="" | |
| 5057 | + data-panel-container-xs-mg="" | |
| 5058 | + data-panel-container-xs-pd="" | |
| 5059 | + data-panel-container-xs-ht="" | |
| 5060 | + data-panel-container-limit=""> | |
| 5061 | + <div class="parsys"><div class="panelContainer section"> | |
| 5062 | + | |
| 5063 | + | |
| 5064 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 5065 | + | |
| 5066 | + | |
| 5067 | + | |
| 5068 | + <div> | |
| 5069 | + | |
| 5070 | + | |
| 5071 | + | |
| 5072 | + | |
| 5073 | + | |
| 5074 | + | |
| 5075 | + | |
| 5076 | + | |
| 5077 | + | |
| 5078 | + | |
| 5079 | + | |
| 5080 | + | |
| 5081 | + | |
| 5082 | + | |
| 5083 | + | |
| 5084 | + | |
| 5085 | + | |
| 5086 | + | |
| 5087 | + | |
| 5088 | + | |
| 5089 | + | |
| 5090 | + | |
| 5091 | + | |
| 5092 | +<div class="panelContainer " | |
| 5093 | + | |
| 5094 | + | |
| 5095 | + data-websites-component="/components/panelContainer.v1" | |
| 5096 | + data-panel-container-lg-mg="5% 0 0 0" | |
| 5097 | + data-panel-container-lg-pd="" | |
| 5098 | + data-panel-container-lg-ht="" | |
| 5099 | + data-panel-container-md-mg="5% 0 0 0" | |
| 5100 | + data-panel-container-md-pd="" | |
| 5101 | + data-panel-container-md-ht="" | |
| 5102 | + data-panel-container-sm-mg="5% 0 0 0" | |
| 5103 | + data-panel-container-sm-pd="" | |
| 5104 | + data-panel-container-sm-ht="" | |
| 5105 | + data-panel-container-xs-mg="5% 0 0 0" | |
| 5106 | + data-panel-container-xs-pd="" | |
| 5107 | + data-panel-container-xs-ht="" | |
| 5108 | + data-panel-container-limit=""> | |
| 5109 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 5110 | + | |
| 5111 | + | |
| 5112 | + | |
| 5113 | + | |
| 5114 | + | |
| 5115 | + | |
| 5116 | + | |
| 5117 | + | |
| 5118 | + | |
| 5119 | + | |
| 5120 | + | |
| 5121 | + | |
| 5122 | + | |
| 5123 | + | |
| 5124 | + | |
| 5125 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_textandimage" class="text-image-container " | |
| 5126 | + data-text-image-container-right-left="false"> | |
| 5127 | + | |
| 5128 | + | |
| 5129 | + | |
| 5130 | + | |
| 5131 | + | |
| 5132 | + | |
| 5133 | + | |
| 5134 | + | |
| 5135 | + | |
| 5136 | + <div class="row text-image-row" | |
| 5137 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 5138 | + | |
| 5139 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 5140 | + | |
| 5141 | + | |
| 5142 | + | |
| 5143 | + | |
| 5144 | + | |
| 5145 | + data-text-image-rowcontainer-height-lg="0" | |
| 5146 | + data-text-image-rowcontainer-width-lg="0" | |
| 5147 | + data-text-image-rowcontainer-class-lg="" | |
| 5148 | + | |
| 5149 | + data-text-image-rowcontainer-bg-type-md="" | |
| 5150 | + | |
| 5151 | + | |
| 5152 | + | |
| 5153 | + | |
| 5154 | + | |
| 5155 | + data-text-image-rowcontainer-height-md="0" | |
| 5156 | + data-text-image-rowcontainer-width-md="0" | |
| 5157 | + data-text-image-rowcontainer-class-md="" | |
| 5158 | + | |
| 5159 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 5160 | + | |
| 5161 | + | |
| 5162 | + | |
| 5163 | + | |
| 5164 | + | |
| 5165 | + data-text-image-rowcontainer-height-sm="0" | |
| 5166 | + data-text-image-rowcontainer-width-sm="0" | |
| 5167 | + data-text-image-rowcontainer-class-sm="" | |
| 5168 | + | |
| 5169 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 5170 | + | |
| 5171 | + | |
| 5172 | + | |
| 5173 | + | |
| 5174 | + | |
| 5175 | + data-text-image-rowcontainer-height-xs="0" | |
| 5176 | + data-text-image-rowcontainer-width-xs="0" | |
| 5177 | + data-text-image-rowcontainer-class-xs=""> | |
| 5178 | + | |
| 5179 | + <div class="col-xs-12 text-image-text-container " ><h2>How to protect yourself against rising mortgage rates</h2> | |
| 5180 | +<p><br> | |
| 5181 | +Several factors affect mortgage rates, including amortization period, market conditions and the key rate set by the Bank of Canada. While there are no guarantees that another hike is on the way, the key rate will be revised again 8 times a year. <a hrefnoextension="false" href="https://www.bankofcanada.ca/core-functions/monetary-policy/key-interest-rate/?theme_mode=light&_gl=1*1xq7n2x*_ga*MTQ4NTE1NDUzOS4xNzA3MzI0MDIw*_ga_D0WRRH3RZH*MTcwNzMyNDAyMC4xLjAuMTcwNzMyNDAyMy41Ny4wLjA." class="link-underlined__darker" target="_blank">View dates</a></p> | |
| 5182 | +<p><b>Planning to buy a home within the next few months? </b></p> | |
| 5183 | +<p>Apply for pre-approval online today. There’s no obligation to take out a loan, but your rate will be protected for 120 days<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false"><sup>9</sup></a> — so you can shop for a home with peace of mind. </p> | |
| 5184 | +<p><br> | |
| 5185 | +<b>Need help? </b></p> | |
| 5186 | +<p>A mortgage advisor can help you complete your application so you can enjoy additional savings.</p> | |
| 5187 | +</div> | |
| 5188 | + </div> | |
| 5189 | + | |
| 5190 | + | |
| 5191 | + | |
| 5192 | + | |
| 5193 | + | |
| 5194 | + | |
| 5195 | + | |
| 5196 | + | |
| 5197 | + | |
| 5198 | + | |
| 5199 | + | |
| 5200 | + <script> | |
| 5201 | + | |
| 5202 | + (function(){ | |
| 5203 | + | |
| 5204 | + var dataLayerViewEventName = '' || ''; | |
| 5205 | + var dataLayerViewLayerProperties = []; | |
| 5206 | + var $el; | |
| 5207 | + | |
| 5208 | + | |
| 5209 | + | |
| 5210 | + if(dataLayerViewEventName.trim().length) { | |
| 5211 | + | |
| 5212 | + var obj = { | |
| 5213 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 5214 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_textandimage" , | |
| 5215 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 5216 | + }; | |
| 5217 | + | |
| 5218 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 5219 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 5220 | + if(document.currentScript){ | |
| 5221 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 5222 | + } else { | |
| 5223 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 5224 | + var currentScript = scripts[scripts.length - 1]; | |
| 5225 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 5226 | + } | |
| 5227 | + | |
| 5228 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 5229 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 5230 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 5231 | + | |
| 5232 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 5233 | + | |
| 5234 | + } | |
| 5235 | + | |
| 5236 | + })(); | |
| 5237 | + | |
| 5238 | + </script> | |
| 5239 | + | |
| 5240 | +</div> | |
| 5241 | + | |
| 5242 | + <script> | |
| 5243 | + | |
| 5244 | + /** | |
| 5245 | + * clickEventDownloadHandler() | |
| 5246 | + * Is used to handle download image action selected as an opening mode | |
| 5247 | + * | |
| 5248 | + */ | |
| 5249 | + | |
| 5250 | + var firstDownload = true; | |
| 5251 | + | |
| 5252 | + function clickEventDownloadHandler() { | |
| 5253 | + | |
| 5254 | + var link = this; | |
| 5255 | + var filename = link.dataset.linkpath; | |
| 5256 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 5257 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 5258 | + | |
| 5259 | + if (newFile) { | |
| 5260 | + | |
| 5261 | + if (firstDownload) { | |
| 5262 | + firstDownload = false; | |
| 5263 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 5264 | + } else { | |
| 5265 | + this.href = link.href; | |
| 5266 | + } | |
| 5267 | + | |
| 5268 | + this.download = fn; | |
| 5269 | + | |
| 5270 | + } else { | |
| 5271 | + this.download = fn + ".html"; | |
| 5272 | + } | |
| 5273 | + } | |
| 5274 | + | |
| 5275 | + </script></div> | |
| 5276 | +<div class="columns parbase section"> | |
| 5277 | + | |
| 5278 | + | |
| 5279 | + | |
| 5280 | + | |
| 5281 | +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div> | |
| 5282 | + | |
| 5283 | + | |
| 5284 | + | |
| 5285 | + | |
| 5286 | + | |
| 5287 | + | |
| 5288 | + | |
| 5289 | + | |
| 5290 | + | |
| 5291 | + | |
| 5292 | + | |
| 5293 | + | |
| 5294 | + | |
| 5295 | + <div style="" | |
| 5296 | + class="columns-row row row-eq-height" | |
| 5297 | + | |
| 5298 | + data-style-lg="" data-height-lg="" | |
| 5299 | + data-width-lg="" | |
| 5300 | + data-background-color-lg="" | |
| 5301 | + data-background-color-xs=""> | |
| 5302 | + <div style="" | |
| 5303 | + class="col-xs-12 col-sm-12 columns-title " | |
| 5304 | + data-height="" data-width="" | |
| 5305 | + data-style-xs="" data-height-xs="" | |
| 5306 | + data-width-xs=""> | |
| 5307 | + | |
| 5308 | + </div> | |
| 5309 | + | |
| 5310 | + | |
| 5311 | + | |
| 5312 | + | |
| 5313 | + <div class="col-xs-12 col-sm-3 column col-first "> | |
| 5314 | + <div class="parsys1 parsys"> | |
| 5315 | +</div> | |
| 5316 | + | |
| 5317 | + </div> | |
| 5318 | + | |
| 5319 | + <div class="col-xs-12 col-sm-3 column "> | |
| 5320 | + <div class="parsys2 parsys"><div class="textandimage parbase section"> | |
| 5321 | + | |
| 5322 | + | |
| 5323 | + | |
| 5324 | + | |
| 5325 | + | |
| 5326 | + | |
| 5327 | + | |
| 5328 | + | |
| 5329 | + | |
| 5330 | + | |
| 5331 | + | |
| 5332 | + | |
| 5333 | + | |
| 5334 | + | |
| 5335 | + | |
| 5336 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_columns_copy_copy_co_parsys2_textandimage_1540660" class="text-image-container " | |
| 5337 | + data-text-image-container-right-left="false"> | |
| 5338 | + | |
| 5339 | + | |
| 5340 | + | |
| 5341 | + | |
| 5342 | + | |
| 5343 | + | |
| 5344 | + | |
| 5345 | + | |
| 5346 | + | |
| 5347 | + <div class="row text-image-row" | |
| 5348 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 5349 | + | |
| 5350 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 5351 | + | |
| 5352 | + | |
| 5353 | + | |
| 5354 | + | |
| 5355 | + | |
| 5356 | + data-text-image-rowcontainer-height-lg="0" | |
| 5357 | + data-text-image-rowcontainer-width-lg="0" | |
| 5358 | + data-text-image-rowcontainer-class-lg="" | |
| 5359 | + | |
| 5360 | + data-text-image-rowcontainer-bg-type-md="" | |
| 5361 | + | |
| 5362 | + | |
| 5363 | + | |
| 5364 | + | |
| 5365 | + | |
| 5366 | + data-text-image-rowcontainer-height-md="0" | |
| 5367 | + data-text-image-rowcontainer-width-md="0" | |
| 5368 | + data-text-image-rowcontainer-class-md="" | |
| 5369 | + | |
| 5370 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 5371 | + | |
| 5372 | + | |
| 5373 | + | |
| 5374 | + | |
| 5375 | + | |
| 5376 | + data-text-image-rowcontainer-height-sm="0" | |
| 5377 | + data-text-image-rowcontainer-width-sm="0" | |
| 5378 | + data-text-image-rowcontainer-class-sm="" | |
| 5379 | + | |
| 5380 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 5381 | + | |
| 5382 | + | |
| 5383 | + | |
| 5384 | + | |
| 5385 | + | |
| 5386 | + data-text-image-rowcontainer-height-xs="0" | |
| 5387 | + data-text-image-rowcontainer-width-xs="0" | |
| 5388 | + data-text-image-rowcontainer-class-xs=""> | |
| 5389 | + | |
| 5390 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a role="button" tabindex="0" onkeyup="if(event.key === ' ') this.click();" href="https://app.bnc.ca/forms/mortgage/preauth?lang=en" class="btnRTE3 btn-arrow btn" target="_blank" hrefnoextension="false">Protect my rate</a></p> | |
| 5391 | +</div> | |
| 5392 | + </div> | |
| 5393 | + | |
| 5394 | + | |
| 5395 | + | |
| 5396 | + | |
| 5397 | + | |
| 5398 | + | |
| 5399 | + | |
| 5400 | + | |
| 5401 | + | |
| 5402 | + | |
| 5403 | + | |
| 5404 | + <script> | |
| 5405 | + | |
| 5406 | + (function(){ | |
| 5407 | + | |
| 5408 | + var dataLayerViewEventName = '' || ''; | |
| 5409 | + var dataLayerViewLayerProperties = []; | |
| 5410 | + var $el; | |
| 5411 | + | |
| 5412 | + | |
| 5413 | + | |
| 5414 | + if(dataLayerViewEventName.trim().length) { | |
| 5415 | + | |
| 5416 | + var obj = { | |
| 5417 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 5418 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_columns_copy_copy_co_parsys2_textandimage_1540660" , | |
| 5419 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 5420 | + }; | |
| 5421 | + | |
| 5422 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 5423 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 5424 | + if(document.currentScript){ | |
| 5425 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 5426 | + } else { | |
| 5427 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 5428 | + var currentScript = scripts[scripts.length - 1]; | |
| 5429 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 5430 | + } | |
| 5431 | + | |
| 5432 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 5433 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 5434 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 5435 | + | |
| 5436 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 5437 | + | |
| 5438 | + } | |
| 5439 | + | |
| 5440 | + })(); | |
| 5441 | + | |
| 5442 | + </script> | |
| 5443 | + | |
| 5444 | +</div> | |
| 5445 | + | |
| 5446 | + <script> | |
| 5447 | + | |
| 5448 | + /** | |
| 5449 | + * clickEventDownloadHandler() | |
| 5450 | + * Is used to handle download image action selected as an opening mode | |
| 5451 | + * | |
| 5452 | + */ | |
| 5453 | + | |
| 5454 | + var firstDownload = true; | |
| 5455 | + | |
| 5456 | + function clickEventDownloadHandler() { | |
| 5457 | + | |
| 5458 | + var link = this; | |
| 5459 | + var filename = link.dataset.linkpath; | |
| 5460 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 5461 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 5462 | + | |
| 5463 | + if (newFile) { | |
| 5464 | + | |
| 5465 | + if (firstDownload) { | |
| 5466 | + firstDownload = false; | |
| 5467 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 5468 | + } else { | |
| 5469 | + this.href = link.href; | |
| 5470 | + } | |
| 5471 | + | |
| 5472 | + this.download = fn; | |
| 5473 | + | |
| 5474 | + } else { | |
| 5475 | + this.download = fn + ".html"; | |
| 5476 | + } | |
| 5477 | + } | |
| 5478 | + | |
| 5479 | + </script></div> | |
| 5480 | + | |
| 5481 | +</div> | |
| 5482 | + | |
| 5483 | + </div> | |
| 5484 | + | |
| 5485 | + <div class="col-xs-12 col-sm-3 column "> | |
| 5486 | + <div class="parsys3 parsys"><div class="textandimage parbase section"> | |
| 5487 | + | |
| 5488 | + | |
| 5489 | + | |
| 5490 | + | |
| 5491 | + | |
| 5492 | + | |
| 5493 | + | |
| 5494 | + | |
| 5495 | + | |
| 5496 | + | |
| 5497 | + | |
| 5498 | + | |
| 5499 | + | |
| 5500 | + | |
| 5501 | + | |
| 5502 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_columns_copy_copy_co_parsys3_textandimage_1540660" class="text-image-container " | |
| 5503 | + data-text-image-container-right-left="false"> | |
| 5504 | + | |
| 5505 | + | |
| 5506 | + | |
| 5507 | + | |
| 5508 | + | |
| 5509 | + | |
| 5510 | + | |
| 5511 | + | |
| 5512 | + | |
| 5513 | + <div class="row text-image-row" | |
| 5514 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 5515 | + | |
| 5516 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 5517 | + | |
| 5518 | + | |
| 5519 | + | |
| 5520 | + | |
| 5521 | + | |
| 5522 | + data-text-image-rowcontainer-height-lg="0" | |
| 5523 | + data-text-image-rowcontainer-width-lg="0" | |
| 5524 | + data-text-image-rowcontainer-class-lg="" | |
| 5525 | + | |
| 5526 | + data-text-image-rowcontainer-bg-type-md="" | |
| 5527 | + | |
| 5528 | + | |
| 5529 | + | |
| 5530 | + | |
| 5531 | + | |
| 5532 | + data-text-image-rowcontainer-height-md="0" | |
| 5533 | + data-text-image-rowcontainer-width-md="0" | |
| 5534 | + data-text-image-rowcontainer-class-md="" | |
| 5535 | + | |
| 5536 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 5537 | + | |
| 5538 | + | |
| 5539 | + | |
| 5540 | + | |
| 5541 | + | |
| 5542 | + data-text-image-rowcontainer-height-sm="0" | |
| 5543 | + data-text-image-rowcontainer-width-sm="0" | |
| 5544 | + data-text-image-rowcontainer-class-sm="" | |
| 5545 | + | |
| 5546 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 5547 | + | |
| 5548 | + | |
| 5549 | + | |
| 5550 | + | |
| 5551 | + | |
| 5552 | + data-text-image-rowcontainer-height-xs="0" | |
| 5553 | + data-text-image-rowcontainer-width-xs="0" | |
| 5554 | + data-text-image-rowcontainer-class-xs=""> | |
| 5555 | + | |
| 5556 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a role="button" tabindex="0" onkeyup="if(event.key === ' ') this.click();" href="https://retail.appointment.bnc.ca/service?category=mo&lang=en&utm_medium=BNCWEBCA&utm_source=14" class="link-not-underlined__darker" target="_blank" hrefnoextension="false">Make an appointment</a></p> | |
| 5557 | +</div> | |
| 5558 | + </div> | |
| 5559 | + | |
| 5560 | + | |
| 5561 | + | |
| 5562 | + | |
| 5563 | + | |
| 5564 | + | |
| 5565 | + | |
| 5566 | + | |
| 5567 | + | |
| 5568 | + | |
| 5569 | + | |
| 5570 | + <script> | |
| 5571 | + | |
| 5572 | + (function(){ | |
| 5573 | + | |
| 5574 | + var dataLayerViewEventName = '' || ''; | |
| 5575 | + var dataLayerViewLayerProperties = []; | |
| 5576 | + var $el; | |
| 5577 | + | |
| 5578 | + | |
| 5579 | + | |
| 5580 | + if(dataLayerViewEventName.trim().length) { | |
| 5581 | + | |
| 5582 | + var obj = { | |
| 5583 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 5584 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_14340_parsys_columns_copy_copy_co_parsys3_textandimage_1540660" , | |
| 5585 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 5586 | + }; | |
| 5587 | + | |
| 5588 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 5589 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 5590 | + if(document.currentScript){ | |
| 5591 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 5592 | + } else { | |
| 5593 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 5594 | + var currentScript = scripts[scripts.length - 1]; | |
| 5595 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 5596 | + } | |
| 5597 | + | |
| 5598 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 5599 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 5600 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 5601 | + | |
| 5602 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 5603 | + | |
| 5604 | + } | |
| 5605 | + | |
| 5606 | + })(); | |
| 5607 | + | |
| 5608 | + </script> | |
| 5609 | + | |
| 5610 | +</div> | |
| 5611 | + | |
| 5612 | + <script> | |
| 5613 | + | |
| 5614 | + /** | |
| 5615 | + * clickEventDownloadHandler() | |
| 5616 | + * Is used to handle download image action selected as an opening mode | |
| 5617 | + * | |
| 5618 | + */ | |
| 5619 | + | |
| 5620 | + var firstDownload = true; | |
| 5621 | + | |
| 5622 | + function clickEventDownloadHandler() { | |
| 5623 | + | |
| 5624 | + var link = this; | |
| 5625 | + var filename = link.dataset.linkpath; | |
| 5626 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 5627 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 5628 | + | |
| 5629 | + if (newFile) { | |
| 5630 | + | |
| 5631 | + if (firstDownload) { | |
| 5632 | + firstDownload = false; | |
| 5633 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 5634 | + } else { | |
| 5635 | + this.href = link.href; | |
| 5636 | + } | |
| 5637 | + | |
| 5638 | + this.download = fn; | |
| 5639 | + | |
| 5640 | + } else { | |
| 5641 | + this.download = fn + ".html"; | |
| 5642 | + } | |
| 5643 | + } | |
| 5644 | + | |
| 5645 | + </script></div> | |
| 5646 | + | |
| 5647 | +</div> | |
| 5648 | + | |
| 5649 | + </div> | |
| 5650 | + | |
| 5651 | + <div class="col-xs-12 col-sm-3 column col-last "> | |
| 5652 | + <div class="parsys4 parsys"> | |
| 5653 | +</div> | |
| 5654 | + | |
| 5655 | + </div> | |
| 5656 | + | |
| 5657 | + </div> | |
| 5658 | + | |
| 5659 | + | |
| 5660 | + | |
| 5661 | +</div> | |
| 5662 | + | |
| 5663 | +</div> | |
| 5664 | + | |
| 5665 | +</div> | |
| 5666 | + | |
| 5667 | + | |
| 5668 | + | |
| 5669 | +<!--/* Initialize Js */--> | |
| 5670 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_14340"> | |
| 5671 | + if(""){ | |
| 5672 | + new Websites.Sticky({ | |
| 5673 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_14340", | |
| 5674 | + breakpoint: { | |
| 5675 | + lg: { | |
| 5676 | + to: "none" | |
| 5677 | + }, | |
| 5678 | + md: { | |
| 5679 | + to: "none" | |
| 5680 | + }, | |
| 5681 | + sm: { | |
| 5682 | + to: "none", | |
| 5683 | + }, | |
| 5684 | + xs: { | |
| 5685 | + to: "none" | |
| 5686 | + } | |
| 5687 | + } | |
| 5688 | + }); | |
| 5689 | + } | |
| 5690 | +</script> | |
| 5691 | + | |
| 5692 | +</div> | |
| 5693 | +</div> | |
| 5694 | +<div class="panelContainer section"> | |
| 5695 | + | |
| 5696 | + | |
| 5697 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 5698 | + | |
| 5699 | + | |
| 5700 | + | |
| 5701 | + <div> | |
| 5702 | + | |
| 5703 | + | |
| 5704 | + | |
| 5705 | + | |
| 5706 | + | |
| 5707 | + | |
| 5708 | + | |
| 5709 | + | |
| 5710 | + | |
| 5711 | + | |
| 5712 | + | |
| 5713 | + | |
| 5714 | + | |
| 5715 | + | |
| 5716 | + | |
| 5717 | + | |
| 5718 | + | |
| 5719 | + | |
| 5720 | + | |
| 5721 | + | |
| 5722 | + | |
| 5723 | + | |
| 5724 | + | |
| 5725 | +<div class="panelContainer " | |
| 5726 | + | |
| 5727 | + | |
| 5728 | + data-websites-component="/components/panelContainer.v1" | |
| 5729 | + data-panel-container-lg-mg="5% 0 0 0" | |
| 5730 | + data-panel-container-lg-pd="" | |
| 5731 | + data-panel-container-lg-ht="" | |
| 5732 | + data-panel-container-md-mg="5% 0 0 0" | |
| 5733 | + data-panel-container-md-pd="" | |
| 5734 | + data-panel-container-md-ht="" | |
| 5735 | + data-panel-container-sm-mg="5% 0 0 0" | |
| 5736 | + data-panel-container-sm-pd="" | |
| 5737 | + data-panel-container-sm-ht="" | |
| 5738 | + data-panel-container-xs-mg="5% 0 0 0" | |
| 5739 | + data-panel-container-xs-pd="" | |
| 5740 | + data-panel-container-xs-ht="" | |
| 5741 | + data-panel-container-limit=""> | |
| 5742 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 5743 | + | |
| 5744 | + | |
| 5745 | + | |
| 5746 | + | |
| 5747 | + | |
| 5748 | + | |
| 5749 | + | |
| 5750 | + | |
| 5751 | + | |
| 5752 | + | |
| 5753 | + | |
| 5754 | + | |
| 5755 | + | |
| 5756 | + | |
| 5757 | + | |
| 5758 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_textandimage_copy" class="text-image-container " | |
| 5759 | + data-text-image-container-right-left="false"> | |
| 5760 | + | |
| 5761 | + | |
| 5762 | + | |
| 5763 | + | |
| 5764 | + | |
| 5765 | + | |
| 5766 | + | |
| 5767 | + | |
| 5768 | + | |
| 5769 | + <div class="row text-image-row" | |
| 5770 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 5771 | + | |
| 5772 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 5773 | + | |
| 5774 | + | |
| 5775 | + | |
| 5776 | + | |
| 5777 | + | |
| 5778 | + data-text-image-rowcontainer-height-lg="0" | |
| 5779 | + data-text-image-rowcontainer-width-lg="0" | |
| 5780 | + data-text-image-rowcontainer-class-lg="" | |
| 5781 | + | |
| 5782 | + data-text-image-rowcontainer-bg-type-md="" | |
| 5783 | + | |
| 5784 | + | |
| 5785 | + | |
| 5786 | + | |
| 5787 | + | |
| 5788 | + data-text-image-rowcontainer-height-md="0" | |
| 5789 | + data-text-image-rowcontainer-width-md="0" | |
| 5790 | + data-text-image-rowcontainer-class-md="" | |
| 5791 | + | |
| 5792 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 5793 | + | |
| 5794 | + | |
| 5795 | + | |
| 5796 | + | |
| 5797 | + | |
| 5798 | + data-text-image-rowcontainer-height-sm="0" | |
| 5799 | + data-text-image-rowcontainer-width-sm="0" | |
| 5800 | + data-text-image-rowcontainer-class-sm="" | |
| 5801 | + | |
| 5802 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 5803 | + | |
| 5804 | + | |
| 5805 | + | |
| 5806 | + | |
| 5807 | + | |
| 5808 | + data-text-image-rowcontainer-height-xs="0" | |
| 5809 | + data-text-image-rowcontainer-width-xs="0" | |
| 5810 | + data-text-image-rowcontainer-class-xs=""> | |
| 5811 | + | |
| 5812 | + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant3">Do your calculations<br> | |
| 5813 | +</h2> | |
| 5814 | +</div> | |
| 5815 | + </div> | |
| 5816 | + | |
| 5817 | + | |
| 5818 | + | |
| 5819 | + | |
| 5820 | + | |
| 5821 | + | |
| 5822 | + | |
| 5823 | + | |
| 5824 | + | |
| 5825 | + | |
| 5826 | + | |
| 5827 | + <script> | |
| 5828 | + | |
| 5829 | + (function(){ | |
| 5830 | + | |
| 5831 | + var dataLayerViewEventName = '' || ''; | |
| 5832 | + var dataLayerViewLayerProperties = []; | |
| 5833 | + var $el; | |
| 5834 | + | |
| 5835 | + | |
| 5836 | + | |
| 5837 | + if(dataLayerViewEventName.trim().length) { | |
| 5838 | + | |
| 5839 | + var obj = { | |
| 5840 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 5841 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_textandimage_copy" , | |
| 5842 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 5843 | + }; | |
| 5844 | + | |
| 5845 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 5846 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 5847 | + if(document.currentScript){ | |
| 5848 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 5849 | + } else { | |
| 5850 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 5851 | + var currentScript = scripts[scripts.length - 1]; | |
| 5852 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 5853 | + } | |
| 5854 | + | |
| 5855 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 5856 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 5857 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 5858 | + | |
| 5859 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 5860 | + | |
| 5861 | + } | |
| 5862 | + | |
| 5863 | + })(); | |
| 5864 | + | |
| 5865 | + </script> | |
| 5866 | + | |
| 5867 | +</div> | |
| 5868 | + | |
| 5869 | + <script> | |
| 5870 | + | |
| 5871 | + /** | |
| 5872 | + * clickEventDownloadHandler() | |
| 5873 | + * Is used to handle download image action selected as an opening mode | |
| 5874 | + * | |
| 5875 | + */ | |
| 5876 | + | |
| 5877 | + var firstDownload = true; | |
| 5878 | + | |
| 5879 | + function clickEventDownloadHandler() { | |
| 5880 | + | |
| 5881 | + var link = this; | |
| 5882 | + var filename = link.dataset.linkpath; | |
| 5883 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 5884 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 5885 | + | |
| 5886 | + if (newFile) { | |
| 5887 | + | |
| 5888 | + if (firstDownload) { | |
| 5889 | + firstDownload = false; | |
| 5890 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 5891 | + } else { | |
| 5892 | + this.href = link.href; | |
| 5893 | + } | |
| 5894 | + | |
| 5895 | + this.download = fn; | |
| 5896 | + | |
| 5897 | + } else { | |
| 5898 | + this.download = fn + ".html"; | |
| 5899 | + } | |
| 5900 | + } | |
| 5901 | + | |
| 5902 | + </script></div> | |
| 5903 | +<div class="columns parbase section"> | |
| 5904 | + | |
| 5905 | + | |
| 5906 | + | |
| 5907 | + | |
| 5908 | +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div> | |
| 5909 | + | |
| 5910 | + | |
| 5911 | + | |
| 5912 | + | |
| 5913 | + | |
| 5914 | + | |
| 5915 | + | |
| 5916 | + | |
| 5917 | + | |
| 5918 | + | |
| 5919 | + | |
| 5920 | + | |
| 5921 | + | |
| 5922 | + <div style="" | |
| 5923 | + class="columns-row row row-eq-height" | |
| 5924 | + | |
| 5925 | + data-style-lg="" data-height-lg="" | |
| 5926 | + data-width-lg="" | |
| 5927 | + data-background-color-lg="" | |
| 5928 | + data-background-color-xs=""> | |
| 5929 | + <div style="" | |
| 5930 | + class="col-xs-12 col-sm-12 columns-title " | |
| 5931 | + data-height="" data-width="" | |
| 5932 | + data-style-xs="" data-height-xs="" | |
| 5933 | + data-width-xs=""> | |
| 5934 | + | |
| 5935 | + </div> | |
| 5936 | + | |
| 5937 | + | |
| 5938 | + | |
| 5939 | + | |
| 5940 | + <div class="col-xs-12 col-sm-3 column col-first "> | |
| 5941 | + <div class="parsys1 parsys"><div class="panelContainer section"> | |
| 5942 | + | |
| 5943 | + | |
| 5944 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 5945 | + | |
| 5946 | + | |
| 5947 | + | |
| 5948 | + <div> | |
| 5949 | + | |
| 5950 | + | |
| 5951 | + | |
| 5952 | + | |
| 5953 | + | |
| 5954 | + | |
| 5955 | + | |
| 5956 | + | |
| 5957 | + | |
| 5958 | + | |
| 5959 | + | |
| 5960 | + | |
| 5961 | + | |
| 5962 | + | |
| 5963 | + | |
| 5964 | + | |
| 5965 | + | |
| 5966 | + | |
| 5967 | + | |
| 5968 | + | |
| 5969 | + | |
| 5970 | + | |
| 5971 | + | |
| 5972 | +<div class="panelContainer " | |
| 5973 | + | |
| 5974 | + | |
| 5975 | + data-websites-component="/components/panelContainer.v1" | |
| 5976 | + data-panel-container-lg-mg="10px 5px 10px 5px" | |
| 5977 | + data-panel-container-lg-pd="" | |
| 5978 | + data-panel-container-lg-ht="" | |
| 5979 | + data-panel-container-md-mg="10px 5px 10px 5px" | |
| 5980 | + data-panel-container-md-pd="" | |
| 5981 | + data-panel-container-md-ht="" | |
| 5982 | + data-panel-container-sm-mg="10px 5px 10px 5px" | |
| 5983 | + data-panel-container-sm-pd="" | |
| 5984 | + data-panel-container-sm-ht="" | |
| 5985 | + data-panel-container-xs-mg="10px" | |
| 5986 | + data-panel-container-xs-pd="" | |
| 5987 | + data-panel-container-xs-ht="" | |
| 5988 | + data-panel-container-limit=""> | |
| 5989 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 5990 | + | |
| 5991 | + | |
| 5992 | + | |
| 5993 | + | |
| 5994 | + | |
| 5995 | + | |
| 5996 | + | |
| 5997 | + | |
| 5998 | + | |
| 5999 | + | |
| 6000 | + | |
| 6001 | + | |
| 6002 | + | |
| 6003 | + | |
| 6004 | + | |
| 6005 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys1_panelcontainer_parsys_textandimage_3840856" class="text-image-container " | |
| 6006 | + data-text-image-container-right-left="false"> | |
| 6007 | + | |
| 6008 | + | |
| 6009 | + | |
| 6010 | + | |
| 6011 | + | |
| 6012 | + | |
| 6013 | + | |
| 6014 | + | |
| 6015 | + | |
| 6016 | + <div class="row text-image-row" | |
| 6017 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 6018 | + | |
| 6019 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 6020 | + | |
| 6021 | + | |
| 6022 | + | |
| 6023 | + | |
| 6024 | + | |
| 6025 | + data-text-image-rowcontainer-height-lg="0" | |
| 6026 | + data-text-image-rowcontainer-width-lg="0" | |
| 6027 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 6028 | + | |
| 6029 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 6030 | + | |
| 6031 | + | |
| 6032 | + | |
| 6033 | + | |
| 6034 | + | |
| 6035 | + data-text-image-rowcontainer-height-md="0" | |
| 6036 | + data-text-image-rowcontainer-width-md="0" | |
| 6037 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 6038 | + | |
| 6039 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 6040 | + | |
| 6041 | + | |
| 6042 | + | |
| 6043 | + | |
| 6044 | + | |
| 6045 | + data-text-image-rowcontainer-height-sm="0" | |
| 6046 | + data-text-image-rowcontainer-width-sm="0" | |
| 6047 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 6048 | + | |
| 6049 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 6050 | + | |
| 6051 | + | |
| 6052 | + | |
| 6053 | + | |
| 6054 | + | |
| 6055 | + data-text-image-rowcontainer-height-xs="0" | |
| 6056 | + data-text-image-rowcontainer-width-xs="0" | |
| 6057 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 6058 | + | |
| 6059 | + | |
| 6060 | + | |
| 6061 | + | |
| 6062 | + | |
| 6063 | + | |
| 6064 | + | |
| 6065 | + | |
| 6066 | + | |
| 6067 | + | |
| 6068 | + | |
| 6069 | + | |
| 6070 | + | |
| 6071 | + | |
| 6072 | + <div class="col-xs-12 text-image-image-container" > | |
| 6073 | + | |
| 6074 | + | |
| 6075 | + | |
| 6076 | + <div> | |
| 6077 | + | |
| 6078 | + | |
| 6079 | + | |
| 6080 | + | |
| 6081 | + | |
| 6082 | + | |
| 6083 | + <picture> | |
| 6084 | + | |
| 6085 | + | |
| 6086 | + | |
| 6087 | + | |
| 6088 | + | |
| 6089 | + | |
| 6090 | + | |
| 6091 | + | |
| 6092 | + | |
| 6093 | + | |
| 6094 | + | |
| 6095 | + | |
| 6096 | + | |
| 6097 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg" media="(max-width: 767px)"> | |
| 6098 | + | |
| 6099 | + | |
| 6100 | + | |
| 6101 | + | |
| 6102 | + | |
| 6103 | + | |
| 6104 | + | |
| 6105 | + | |
| 6106 | + | |
| 6107 | + | |
| 6108 | + | |
| 6109 | + | |
| 6110 | + | |
| 6111 | + | |
| 6112 | + | |
| 6113 | + | |
| 6114 | + | |
| 6115 | + | |
| 6116 | + | |
| 6117 | + | |
| 6118 | + | |
| 6119 | + | |
| 6120 | + | |
| 6121 | + | |
| 6122 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg" media="(max-width: 991px)"> | |
| 6123 | + | |
| 6124 | + | |
| 6125 | + | |
| 6126 | + | |
| 6127 | + | |
| 6128 | + | |
| 6129 | + | |
| 6130 | + | |
| 6131 | + | |
| 6132 | + | |
| 6133 | + | |
| 6134 | + | |
| 6135 | + | |
| 6136 | + | |
| 6137 | + | |
| 6138 | + | |
| 6139 | + | |
| 6140 | + | |
| 6141 | + | |
| 6142 | + | |
| 6143 | + | |
| 6144 | + | |
| 6145 | + | |
| 6146 | + | |
| 6147 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg" media="(max-width: 1199px)"> | |
| 6148 | + | |
| 6149 | + | |
| 6150 | + | |
| 6151 | + | |
| 6152 | + | |
| 6153 | + | |
| 6154 | + | |
| 6155 | + | |
| 6156 | + | |
| 6157 | + | |
| 6158 | + | |
| 6159 | + | |
| 6160 | + | |
| 6161 | + | |
| 6162 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg" media="(min-width: 1200px)"> | |
| 6163 | + | |
| 6164 | + | |
| 6165 | + | |
| 6166 | + | |
| 6167 | + <img src='/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg' srcset='/content/dam/bnc/particuliers/img/375x195/img-combien-emprunter-375x195.jpg' data-websites-component="/components/textandimage/image" alt="Illustration of bundle of banknotes with thought bubble containing a question mark " data-picture-alttext-lg="Illustration of bundle of banknotes with thought bubble containing a question mark " data-picture-alttext-md="Illustration of bundle of banknotes with thought bubble containing a question mark " data-picture-alttext-sm="Illustration of bundle of banknotes with thought bubble containing a question mark " data-picture-alttext-xs="Illustration of bundle of banknotes with thought bubble containing a question mark " class="center-block image-responsive"> | |
| 6168 | + </picture> | |
| 6169 | + | |
| 6170 | + | |
| 6171 | + | |
| 6172 | + <script type="text/javascript"> | |
| 6173 | + | |
| 6174 | + var Websites = Websites || {}; | |
| 6175 | + Websites.FragmentPicture = Websites.FragmentPicture || { | |
| 6176 | + init: function(viewport) { | |
| 6177 | + Websites.FragmentPicture.loadAlternativeText(viewport); | |
| 6178 | + }, | |
| 6179 | + | |
| 6180 | + loadAlternativeText: function(viewport) { | |
| 6181 | + $('[data-websites-component="/components/textandimage/image"]').each(function(){ | |
| 6182 | + if(viewport.is("xs") ) { | |
| 6183 | + $(this).attr("alt", $(this).data("picture-alttext-xs")); | |
| 6184 | + } else if(viewport.is("sm") ) { | |
| 6185 | + $(this).attr("alt", $(this).data("picture-alttext-sm")); | |
| 6186 | + } else if(viewport.is("md") ) { | |
| 6187 | + $(this).attr("alt", $(this).data("picture-alttext-md")); | |
| 6188 | + } else if(viewport.is("lg") ) { | |
| 6189 | + $(this).attr("alt", $(this).data("picture-alttext-lg")); | |
| 6190 | + } | |
| 6191 | + }); | |
| 6192 | + } | |
| 6193 | + }; | |
| 6194 | + | |
| 6195 | + $(document).ready(function(){ | |
| 6196 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 6197 | + }); | |
| 6198 | + | |
| 6199 | + Websites.Events.onBreakpointChanged(function(){ | |
| 6200 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 6201 | + }); | |
| 6202 | + </script> | |
| 6203 | + | |
| 6204 | + | |
| 6205 | + | |
| 6206 | + | |
| 6207 | + | |
| 6208 | + </div> | |
| 6209 | + | |
| 6210 | + | |
| 6211 | + | |
| 6212 | +</div> | |
| 6213 | +<div | |
| 6214 | + class="col-xs-12 text-image-text-container " | |
| 6215 | + | |
| 6216 | + data-websites-component="/components/textandimage/text" | |
| 6217 | + data-text-image-text-container-style-xs="{'padding-top': '0px'}" | |
| 6218 | + data-text-image-text-container-style-sm="{'padding-top': '0px'}" | |
| 6219 | + data-text-image-text-container-style-md="{'padding-top': '0px'}" | |
| 6220 | + data-text-image-text-container-style-lg="{'padding-top': '0px'}"><p style="text-align: center;"><b>How much can you borrow?</b><br> | |
| 6221 | +</p> | |
| 6222 | +<p style="text-align: center;">Estimate the mortgage amount you could get.<br> | |
| 6223 | +</p> | |
| 6224 | +</div> | |
| 6225 | + | |
| 6226 | + | |
| 6227 | + | |
| 6228 | + | |
| 6229 | + | |
| 6230 | + | |
| 6231 | + | |
| 6232 | + | |
| 6233 | + | |
| 6234 | + </div> | |
| 6235 | + | |
| 6236 | + | |
| 6237 | + | |
| 6238 | + | |
| 6239 | + | |
| 6240 | + | |
| 6241 | + | |
| 6242 | + | |
| 6243 | + | |
| 6244 | + | |
| 6245 | + | |
| 6246 | + | |
| 6247 | + <script> | |
| 6248 | + | |
| 6249 | + (function(){ | |
| 6250 | + | |
| 6251 | + var dataLayerViewEventName = '' || ''; | |
| 6252 | + var dataLayerViewLayerProperties = []; | |
| 6253 | + var $el; | |
| 6254 | + | |
| 6255 | + | |
| 6256 | + | |
| 6257 | + if(dataLayerViewEventName.trim().length) { | |
| 6258 | + | |
| 6259 | + var obj = { | |
| 6260 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 6261 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys1_panelcontainer_parsys_textandimage_3840856" , | |
| 6262 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 6263 | + }; | |
| 6264 | + | |
| 6265 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 6266 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 6267 | + if(document.currentScript){ | |
| 6268 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 6269 | + } else { | |
| 6270 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 6271 | + var currentScript = scripts[scripts.length - 1]; | |
| 6272 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 6273 | + } | |
| 6274 | + | |
| 6275 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 6276 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 6277 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 6278 | + | |
| 6279 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 6280 | + | |
| 6281 | + } | |
| 6282 | + | |
| 6283 | + })(); | |
| 6284 | + | |
| 6285 | + </script> | |
| 6286 | + | |
| 6287 | +</div> | |
| 6288 | + | |
| 6289 | + <script> | |
| 6290 | + | |
| 6291 | + /** | |
| 6292 | + * clickEventDownloadHandler() | |
| 6293 | + * Is used to handle download image action selected as an opening mode | |
| 6294 | + * | |
| 6295 | + */ | |
| 6296 | + | |
| 6297 | + var firstDownload = true; | |
| 6298 | + | |
| 6299 | + function clickEventDownloadHandler() { | |
| 6300 | + | |
| 6301 | + var link = this; | |
| 6302 | + var filename = link.dataset.linkpath; | |
| 6303 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 6304 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 6305 | + | |
| 6306 | + if (newFile) { | |
| 6307 | + | |
| 6308 | + if (firstDownload) { | |
| 6309 | + firstDownload = false; | |
| 6310 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 6311 | + } else { | |
| 6312 | + this.href = link.href; | |
| 6313 | + } | |
| 6314 | + | |
| 6315 | + this.download = fn; | |
| 6316 | + | |
| 6317 | + } else { | |
| 6318 | + this.download = fn + ".html"; | |
| 6319 | + } | |
| 6320 | + } | |
| 6321 | + | |
| 6322 | + </script></div> | |
| 6323 | +<div class="textandimage parbase section"> | |
| 6324 | + | |
| 6325 | + | |
| 6326 | + | |
| 6327 | + | |
| 6328 | + | |
| 6329 | + | |
| 6330 | + | |
| 6331 | + | |
| 6332 | + | |
| 6333 | + | |
| 6334 | + | |
| 6335 | + | |
| 6336 | + | |
| 6337 | + | |
| 6338 | + | |
| 6339 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys1_panelcontainer_parsys_textandimage_copy_co" class="text-image-container " | |
| 6340 | + data-text-image-container-right-left="false"> | |
| 6341 | + | |
| 6342 | + | |
| 6343 | + | |
| 6344 | + | |
| 6345 | + | |
| 6346 | + | |
| 6347 | + | |
| 6348 | + | |
| 6349 | + | |
| 6350 | + <div class="row text-image-row" | |
| 6351 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 6352 | + | |
| 6353 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 6354 | + | |
| 6355 | + | |
| 6356 | + | |
| 6357 | + | |
| 6358 | + | |
| 6359 | + data-text-image-rowcontainer-height-lg="0" | |
| 6360 | + data-text-image-rowcontainer-width-lg="0" | |
| 6361 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 6362 | + | |
| 6363 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 6364 | + | |
| 6365 | + | |
| 6366 | + | |
| 6367 | + | |
| 6368 | + | |
| 6369 | + data-text-image-rowcontainer-height-md="0" | |
| 6370 | + data-text-image-rowcontainer-width-md="0" | |
| 6371 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 6372 | + | |
| 6373 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 6374 | + | |
| 6375 | + | |
| 6376 | + | |
| 6377 | + | |
| 6378 | + | |
| 6379 | + data-text-image-rowcontainer-height-sm="0" | |
| 6380 | + data-text-image-rowcontainer-width-sm="0" | |
| 6381 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 6382 | + | |
| 6383 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 6384 | + | |
| 6385 | + | |
| 6386 | + | |
| 6387 | + | |
| 6388 | + | |
| 6389 | + data-text-image-rowcontainer-height-xs="0" | |
| 6390 | + data-text-image-rowcontainer-width-xs="0" | |
| 6391 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 6392 | + | |
| 6393 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/calculators/borrowing-capacity.html" target="_self" hrefnoextension="false">Calculate my loan</a></p> | |
| 6394 | +</div> | |
| 6395 | + </div> | |
| 6396 | + | |
| 6397 | + | |
| 6398 | + | |
| 6399 | + | |
| 6400 | + | |
| 6401 | + | |
| 6402 | + | |
| 6403 | + | |
| 6404 | + | |
| 6405 | + | |
| 6406 | + | |
| 6407 | + <script> | |
| 6408 | + | |
| 6409 | + (function(){ | |
| 6410 | + | |
| 6411 | + var dataLayerViewEventName = '' || ''; | |
| 6412 | + var dataLayerViewLayerProperties = []; | |
| 6413 | + var $el; | |
| 6414 | + | |
| 6415 | + | |
| 6416 | + | |
| 6417 | + if(dataLayerViewEventName.trim().length) { | |
| 6418 | + | |
| 6419 | + var obj = { | |
| 6420 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 6421 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys1_panelcontainer_parsys_textandimage_copy_co" , | |
| 6422 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 6423 | + }; | |
| 6424 | + | |
| 6425 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 6426 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 6427 | + if(document.currentScript){ | |
| 6428 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 6429 | + } else { | |
| 6430 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 6431 | + var currentScript = scripts[scripts.length - 1]; | |
| 6432 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 6433 | + } | |
| 6434 | + | |
| 6435 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 6436 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 6437 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 6438 | + | |
| 6439 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 6440 | + | |
| 6441 | + } | |
| 6442 | + | |
| 6443 | + })(); | |
| 6444 | + | |
| 6445 | + </script> | |
| 6446 | + | |
| 6447 | +</div> | |
| 6448 | + | |
| 6449 | + <script> | |
| 6450 | + | |
| 6451 | + /** | |
| 6452 | + * clickEventDownloadHandler() | |
| 6453 | + * Is used to handle download image action selected as an opening mode | |
| 6454 | + * | |
| 6455 | + */ | |
| 6456 | + | |
| 6457 | + var firstDownload = true; | |
| 6458 | + | |
| 6459 | + function clickEventDownloadHandler() { | |
| 6460 | + | |
| 6461 | + var link = this; | |
| 6462 | + var filename = link.dataset.linkpath; | |
| 6463 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 6464 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 6465 | + | |
| 6466 | + if (newFile) { | |
| 6467 | + | |
| 6468 | + if (firstDownload) { | |
| 6469 | + firstDownload = false; | |
| 6470 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 6471 | + } else { | |
| 6472 | + this.href = link.href; | |
| 6473 | + } | |
| 6474 | + | |
| 6475 | + this.download = fn; | |
| 6476 | + | |
| 6477 | + } else { | |
| 6478 | + this.download = fn + ".html"; | |
| 6479 | + } | |
| 6480 | + } | |
| 6481 | + | |
| 6482 | + </script></div> | |
| 6483 | + | |
| 6484 | +</div> | |
| 6485 | + | |
| 6486 | +</div> | |
| 6487 | + | |
| 6488 | + | |
| 6489 | + | |
| 6490 | +<!--/* Initialize Js */--> | |
| 6491 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys1/panelcontainer"> | |
| 6492 | + if(""){ | |
| 6493 | + new Websites.Sticky({ | |
| 6494 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys1/panelcontainer", | |
| 6495 | + breakpoint: { | |
| 6496 | + lg: { | |
| 6497 | + to: "" | |
| 6498 | + }, | |
| 6499 | + md: { | |
| 6500 | + to: "" | |
| 6501 | + }, | |
| 6502 | + sm: { | |
| 6503 | + to: "", | |
| 6504 | + }, | |
| 6505 | + xs: { | |
| 6506 | + to: "" | |
| 6507 | + } | |
| 6508 | + } | |
| 6509 | + }); | |
| 6510 | + } | |
| 6511 | +</script> | |
| 6512 | + | |
| 6513 | +</div> | |
| 6514 | +</div> | |
| 6515 | + | |
| 6516 | +</div> | |
| 6517 | + | |
| 6518 | + </div> | |
| 6519 | + | |
| 6520 | + <div class="col-xs-12 col-sm-3 column "> | |
| 6521 | + <div class="parsys2 parsys"><div class="panelContainer section"> | |
| 6522 | + | |
| 6523 | + | |
| 6524 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 6525 | + | |
| 6526 | + | |
| 6527 | + | |
| 6528 | + <div> | |
| 6529 | + | |
| 6530 | + | |
| 6531 | + | |
| 6532 | + | |
| 6533 | + | |
| 6534 | + | |
| 6535 | + | |
| 6536 | + | |
| 6537 | + | |
| 6538 | + | |
| 6539 | + | |
| 6540 | + | |
| 6541 | + | |
| 6542 | + | |
| 6543 | + | |
| 6544 | + | |
| 6545 | + | |
| 6546 | + | |
| 6547 | + | |
| 6548 | + | |
| 6549 | + | |
| 6550 | + | |
| 6551 | + | |
| 6552 | +<div class="panelContainer " | |
| 6553 | + | |
| 6554 | + | |
| 6555 | + data-websites-component="/components/panelContainer.v1" | |
| 6556 | + data-panel-container-lg-mg="10px 5px 10px 5px" | |
| 6557 | + data-panel-container-lg-pd="" | |
| 6558 | + data-panel-container-lg-ht="" | |
| 6559 | + data-panel-container-md-mg="10px 5px 10px 5px" | |
| 6560 | + data-panel-container-md-pd="" | |
| 6561 | + data-panel-container-md-ht="" | |
| 6562 | + data-panel-container-sm-mg="10px 5px 10px 5px" | |
| 6563 | + data-panel-container-sm-pd="" | |
| 6564 | + data-panel-container-sm-ht="" | |
| 6565 | + data-panel-container-xs-mg="10px" | |
| 6566 | + data-panel-container-xs-pd="" | |
| 6567 | + data-panel-container-xs-ht="" | |
| 6568 | + data-panel-container-limit=""> | |
| 6569 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 6570 | + | |
| 6571 | + | |
| 6572 | + | |
| 6573 | + | |
| 6574 | + | |
| 6575 | + | |
| 6576 | + | |
| 6577 | + | |
| 6578 | + | |
| 6579 | + | |
| 6580 | + | |
| 6581 | + | |
| 6582 | + | |
| 6583 | + | |
| 6584 | + | |
| 6585 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys2_panelcontainer_61569_parsys_textandimage_7231150" class="text-image-container " | |
| 6586 | + data-text-image-container-right-left="false"> | |
| 6587 | + | |
| 6588 | + | |
| 6589 | + | |
| 6590 | + | |
| 6591 | + | |
| 6592 | + | |
| 6593 | + | |
| 6594 | + | |
| 6595 | + | |
| 6596 | + <div class="row text-image-row" | |
| 6597 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 6598 | + | |
| 6599 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 6600 | + | |
| 6601 | + | |
| 6602 | + | |
| 6603 | + | |
| 6604 | + | |
| 6605 | + data-text-image-rowcontainer-height-lg="0" | |
| 6606 | + data-text-image-rowcontainer-width-lg="0" | |
| 6607 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 6608 | + | |
| 6609 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 6610 | + | |
| 6611 | + | |
| 6612 | + | |
| 6613 | + | |
| 6614 | + | |
| 6615 | + data-text-image-rowcontainer-height-md="0" | |
| 6616 | + data-text-image-rowcontainer-width-md="0" | |
| 6617 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 6618 | + | |
| 6619 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 6620 | + | |
| 6621 | + | |
| 6622 | + | |
| 6623 | + | |
| 6624 | + | |
| 6625 | + data-text-image-rowcontainer-height-sm="0" | |
| 6626 | + data-text-image-rowcontainer-width-sm="0" | |
| 6627 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 6628 | + | |
| 6629 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 6630 | + | |
| 6631 | + | |
| 6632 | + | |
| 6633 | + | |
| 6634 | + | |
| 6635 | + data-text-image-rowcontainer-height-xs="0" | |
| 6636 | + data-text-image-rowcontainer-width-xs="0" | |
| 6637 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 6638 | + | |
| 6639 | + | |
| 6640 | + | |
| 6641 | + | |
| 6642 | + | |
| 6643 | + | |
| 6644 | + | |
| 6645 | + | |
| 6646 | + | |
| 6647 | + | |
| 6648 | + | |
| 6649 | + | |
| 6650 | + | |
| 6651 | + | |
| 6652 | + <div class="col-xs-12 text-image-image-container" > | |
| 6653 | + | |
| 6654 | + | |
| 6655 | + | |
| 6656 | + <div> | |
| 6657 | + | |
| 6658 | + | |
| 6659 | + | |
| 6660 | + | |
| 6661 | + | |
| 6662 | + | |
| 6663 | + <picture> | |
| 6664 | + | |
| 6665 | + | |
| 6666 | + | |
| 6667 | + | |
| 6668 | + | |
| 6669 | + | |
| 6670 | + | |
| 6671 | + | |
| 6672 | + | |
| 6673 | + | |
| 6674 | + | |
| 6675 | + | |
| 6676 | + | |
| 6677 | + <source srcset="/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg" media="(max-width: 767px)"> | |
| 6678 | + | |
| 6679 | + | |
| 6680 | + | |
| 6681 | + | |
| 6682 | + | |
| 6683 | + | |
| 6684 | + | |
| 6685 | + | |
| 6686 | + | |
| 6687 | + | |
| 6688 | + | |
| 6689 | + | |
| 6690 | + | |
| 6691 | + | |
| 6692 | + | |
| 6693 | + | |
| 6694 | + | |
| 6695 | + | |
| 6696 | + | |
| 6697 | + | |
| 6698 | + | |
| 6699 | + | |
| 6700 | + | |
| 6701 | + | |
| 6702 | + <source srcset="/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg" media="(max-width: 991px)"> | |
| 6703 | + | |
| 6704 | + | |
| 6705 | + | |
| 6706 | + | |
| 6707 | + | |
| 6708 | + | |
| 6709 | + | |
| 6710 | + | |
| 6711 | + | |
| 6712 | + | |
| 6713 | + | |
| 6714 | + | |
| 6715 | + | |
| 6716 | + | |
| 6717 | + | |
| 6718 | + | |
| 6719 | + | |
| 6720 | + | |
| 6721 | + | |
| 6722 | + | |
| 6723 | + | |
| 6724 | + | |
| 6725 | + | |
| 6726 | + | |
| 6727 | + <source srcset="/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg" media="(max-width: 1199px)"> | |
| 6728 | + | |
| 6729 | + | |
| 6730 | + | |
| 6731 | + | |
| 6732 | + | |
| 6733 | + | |
| 6734 | + | |
| 6735 | + | |
| 6736 | + | |
| 6737 | + | |
| 6738 | + | |
| 6739 | + | |
| 6740 | + | |
| 6741 | + | |
| 6742 | + <source srcset="/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg" media="(min-width: 1200px)"> | |
| 6743 | + | |
| 6744 | + | |
| 6745 | + | |
| 6746 | + | |
| 6747 | + <img src='/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg' srcset='/content/dam/bnc/particuliers/img/img-montants-versements-calculatrice-375x195.jpg' data-websites-component="/components/textandimage/image" alt="Picto of a calculator and house with the National Bank logo in the background" data-picture-alttext-lg="Picto of a calculator and house with the National Bank logo in the background" data-picture-alttext-md="Picto of a calculator and house with the National Bank logo in the background" data-picture-alttext-sm="Picto of a calculator and house with the National Bank logo in the background" data-picture-alttext-xs="Picto of a calculator and house with the National Bank logo in the background" class="center-block image-responsive"> | |
| 6748 | + </picture> | |
| 6749 | + | |
| 6750 | + | |
| 6751 | + | |
| 6752 | + <script type="text/javascript"> | |
| 6753 | + | |
| 6754 | + var Websites = Websites || {}; | |
| 6755 | + Websites.FragmentPicture = Websites.FragmentPicture || { | |
| 6756 | + init: function(viewport) { | |
| 6757 | + Websites.FragmentPicture.loadAlternativeText(viewport); | |
| 6758 | + }, | |
| 6759 | + | |
| 6760 | + loadAlternativeText: function(viewport) { | |
| 6761 | + $('[data-websites-component="/components/textandimage/image"]').each(function(){ | |
| 6762 | + if(viewport.is("xs") ) { | |
| 6763 | + $(this).attr("alt", $(this).data("picture-alttext-xs")); | |
| 6764 | + } else if(viewport.is("sm") ) { | |
| 6765 | + $(this).attr("alt", $(this).data("picture-alttext-sm")); | |
| 6766 | + } else if(viewport.is("md") ) { | |
| 6767 | + $(this).attr("alt", $(this).data("picture-alttext-md")); | |
| 6768 | + } else if(viewport.is("lg") ) { | |
| 6769 | + $(this).attr("alt", $(this).data("picture-alttext-lg")); | |
| 6770 | + } | |
| 6771 | + }); | |
| 6772 | + } | |
| 6773 | + }; | |
| 6774 | + | |
| 6775 | + $(document).ready(function(){ | |
| 6776 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 6777 | + }); | |
| 6778 | + | |
| 6779 | + Websites.Events.onBreakpointChanged(function(){ | |
| 6780 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 6781 | + }); | |
| 6782 | + </script> | |
| 6783 | + | |
| 6784 | + | |
| 6785 | + | |
| 6786 | + | |
| 6787 | + | |
| 6788 | + </div> | |
| 6789 | + | |
| 6790 | + | |
| 6791 | + | |
| 6792 | +</div> | |
| 6793 | +<div | |
| 6794 | + class="col-xs-12 text-image-text-container " | |
| 6795 | + | |
| 6796 | + data-websites-component="/components/textandimage/text" | |
| 6797 | + data-text-image-text-container-style-xs="{'padding-top': '0px'}" | |
| 6798 | + data-text-image-text-container-style-sm="{'padding-top': '0px'}" | |
| 6799 | + data-text-image-text-container-style-md="{'padding-top': '0px'}" | |
| 6800 | + data-text-image-text-container-style-lg="{'padding-top': '0px'}"><p style="text-align: center;"><b>Calculate your monthly payments</b><br> | |
| 6801 | +</p> | |
| 6802 | +<p style="text-align: center;">Figure out how much you could repay each month based on your budget.<br> | |
| 6803 | +</p> | |
| 6804 | +<p class="pvariant3" style="text-align: center;"><a href="/personal/mortgages/calculators/payments.html" target="_blank" hrefnoextension="false">Calculate my payments</a><br> | |
| 6805 | +</p> | |
| 6806 | +</div> | |
| 6807 | + | |
| 6808 | + | |
| 6809 | + | |
| 6810 | + | |
| 6811 | + | |
| 6812 | + | |
| 6813 | + | |
| 6814 | + | |
| 6815 | + | |
| 6816 | + </div> | |
| 6817 | + | |
| 6818 | + | |
| 6819 | + | |
| 6820 | + | |
| 6821 | + | |
| 6822 | + | |
| 6823 | + | |
| 6824 | + | |
| 6825 | + | |
| 6826 | + | |
| 6827 | + | |
| 6828 | + | |
| 6829 | + <script> | |
| 6830 | + | |
| 6831 | + (function(){ | |
| 6832 | + | |
| 6833 | + var dataLayerViewEventName = '' || ''; | |
| 6834 | + var dataLayerViewLayerProperties = []; | |
| 6835 | + var $el; | |
| 6836 | + | |
| 6837 | + | |
| 6838 | + | |
| 6839 | + if(dataLayerViewEventName.trim().length) { | |
| 6840 | + | |
| 6841 | + var obj = { | |
| 6842 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 6843 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys2_panelcontainer_61569_parsys_textandimage_7231150" , | |
| 6844 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 6845 | + }; | |
| 6846 | + | |
| 6847 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 6848 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 6849 | + if(document.currentScript){ | |
| 6850 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 6851 | + } else { | |
| 6852 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 6853 | + var currentScript = scripts[scripts.length - 1]; | |
| 6854 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 6855 | + } | |
| 6856 | + | |
| 6857 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 6858 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 6859 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 6860 | + | |
| 6861 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 6862 | + | |
| 6863 | + } | |
| 6864 | + | |
| 6865 | + })(); | |
| 6866 | + | |
| 6867 | + </script> | |
| 6868 | + | |
| 6869 | +</div> | |
| 6870 | + | |
| 6871 | + <script> | |
| 6872 | + | |
| 6873 | + /** | |
| 6874 | + * clickEventDownloadHandler() | |
| 6875 | + * Is used to handle download image action selected as an opening mode | |
| 6876 | + * | |
| 6877 | + */ | |
| 6878 | + | |
| 6879 | + var firstDownload = true; | |
| 6880 | + | |
| 6881 | + function clickEventDownloadHandler() { | |
| 6882 | + | |
| 6883 | + var link = this; | |
| 6884 | + var filename = link.dataset.linkpath; | |
| 6885 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 6886 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 6887 | + | |
| 6888 | + if (newFile) { | |
| 6889 | + | |
| 6890 | + if (firstDownload) { | |
| 6891 | + firstDownload = false; | |
| 6892 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 6893 | + } else { | |
| 6894 | + this.href = link.href; | |
| 6895 | + } | |
| 6896 | + | |
| 6897 | + this.download = fn; | |
| 6898 | + | |
| 6899 | + } else { | |
| 6900 | + this.download = fn + ".html"; | |
| 6901 | + } | |
| 6902 | + } | |
| 6903 | + | |
| 6904 | + </script></div> | |
| 6905 | + | |
| 6906 | +</div> | |
| 6907 | + | |
| 6908 | +</div> | |
| 6909 | + | |
| 6910 | + | |
| 6911 | + | |
| 6912 | +<!--/* Initialize Js */--> | |
| 6913 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys2/panelcontainer_61569"> | |
| 6914 | + if(""){ | |
| 6915 | + new Websites.Sticky({ | |
| 6916 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys2/panelcontainer_61569", | |
| 6917 | + breakpoint: { | |
| 6918 | + lg: { | |
| 6919 | + to: "" | |
| 6920 | + }, | |
| 6921 | + md: { | |
| 6922 | + to: "" | |
| 6923 | + }, | |
| 6924 | + sm: { | |
| 6925 | + to: "", | |
| 6926 | + }, | |
| 6927 | + xs: { | |
| 6928 | + to: "" | |
| 6929 | + } | |
| 6930 | + } | |
| 6931 | + }); | |
| 6932 | + } | |
| 6933 | +</script> | |
| 6934 | + | |
| 6935 | +</div> | |
| 6936 | +</div> | |
| 6937 | + | |
| 6938 | +</div> | |
| 6939 | + | |
| 6940 | + </div> | |
| 6941 | + | |
| 6942 | + <div class="col-xs-12 col-sm-3 column "> | |
| 6943 | + <div class="parsys3 parsys"><div class="panelContainer section"> | |
| 6944 | + | |
| 6945 | + | |
| 6946 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 6947 | + | |
| 6948 | + | |
| 6949 | + | |
| 6950 | + <div> | |
| 6951 | + | |
| 6952 | + | |
| 6953 | + | |
| 6954 | + | |
| 6955 | + | |
| 6956 | + | |
| 6957 | + | |
| 6958 | + | |
| 6959 | + | |
| 6960 | + | |
| 6961 | + | |
| 6962 | + | |
| 6963 | + | |
| 6964 | + | |
| 6965 | + | |
| 6966 | + | |
| 6967 | + | |
| 6968 | + | |
| 6969 | + | |
| 6970 | + | |
| 6971 | + | |
| 6972 | + | |
| 6973 | + | |
| 6974 | +<div class="panelContainer " | |
| 6975 | + | |
| 6976 | + | |
| 6977 | + data-websites-component="/components/panelContainer.v1" | |
| 6978 | + data-panel-container-lg-mg="10px 5px 10px 5px" | |
| 6979 | + data-panel-container-lg-pd="" | |
| 6980 | + data-panel-container-lg-ht="" | |
| 6981 | + data-panel-container-md-mg="10px 5px 10px 5px" | |
| 6982 | + data-panel-container-md-pd="" | |
| 6983 | + data-panel-container-md-ht="" | |
| 6984 | + data-panel-container-sm-mg="10px 5px 10px 5px" | |
| 6985 | + data-panel-container-sm-pd="" | |
| 6986 | + data-panel-container-sm-ht="" | |
| 6987 | + data-panel-container-xs-mg="10px" | |
| 6988 | + data-panel-container-xs-pd="" | |
| 6989 | + data-panel-container-xs-ht="" | |
| 6990 | + data-panel-container-limit=""> | |
| 6991 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 6992 | + | |
| 6993 | + | |
| 6994 | + | |
| 6995 | + | |
| 6996 | + | |
| 6997 | + | |
| 6998 | + | |
| 6999 | + | |
| 7000 | + | |
| 7001 | + | |
| 7002 | + | |
| 7003 | + | |
| 7004 | + | |
| 7005 | + | |
| 7006 | + | |
| 7007 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys3_panelcontainer_1423965634_parsys_textandimage_7231150" class="text-image-container " | |
| 7008 | + data-text-image-container-right-left="false"> | |
| 7009 | + | |
| 7010 | + | |
| 7011 | + | |
| 7012 | + | |
| 7013 | + | |
| 7014 | + | |
| 7015 | + | |
| 7016 | + | |
| 7017 | + | |
| 7018 | + <div class="row text-image-row" | |
| 7019 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 7020 | + | |
| 7021 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 7022 | + | |
| 7023 | + | |
| 7024 | + | |
| 7025 | + | |
| 7026 | + | |
| 7027 | + data-text-image-rowcontainer-height-lg="0" | |
| 7028 | + data-text-image-rowcontainer-width-lg="0" | |
| 7029 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 7030 | + | |
| 7031 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 7032 | + | |
| 7033 | + | |
| 7034 | + | |
| 7035 | + | |
| 7036 | + | |
| 7037 | + data-text-image-rowcontainer-height-md="0" | |
| 7038 | + data-text-image-rowcontainer-width-md="0" | |
| 7039 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 7040 | + | |
| 7041 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 7042 | + | |
| 7043 | + | |
| 7044 | + | |
| 7045 | + | |
| 7046 | + | |
| 7047 | + data-text-image-rowcontainer-height-sm="0" | |
| 7048 | + data-text-image-rowcontainer-width-sm="0" | |
| 7049 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 7050 | + | |
| 7051 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 7052 | + | |
| 7053 | + | |
| 7054 | + | |
| 7055 | + | |
| 7056 | + | |
| 7057 | + data-text-image-rowcontainer-height-xs="0" | |
| 7058 | + data-text-image-rowcontainer-width-xs="0" | |
| 7059 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 7060 | + | |
| 7061 | + | |
| 7062 | + | |
| 7063 | + | |
| 7064 | + | |
| 7065 | + | |
| 7066 | + | |
| 7067 | + | |
| 7068 | + | |
| 7069 | + | |
| 7070 | + | |
| 7071 | + | |
| 7072 | + | |
| 7073 | + | |
| 7074 | + <div class="col-xs-12 text-image-image-container" > | |
| 7075 | + | |
| 7076 | + | |
| 7077 | + | |
| 7078 | + <div> | |
| 7079 | + | |
| 7080 | + | |
| 7081 | + | |
| 7082 | + | |
| 7083 | + | |
| 7084 | + | |
| 7085 | + <picture> | |
| 7086 | + | |
| 7087 | + | |
| 7088 | + | |
| 7089 | + | |
| 7090 | + | |
| 7091 | + | |
| 7092 | + | |
| 7093 | + | |
| 7094 | + | |
| 7095 | + | |
| 7096 | + | |
| 7097 | + | |
| 7098 | + | |
| 7099 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg" media="(max-width: 767px)"> | |
| 7100 | + | |
| 7101 | + | |
| 7102 | + | |
| 7103 | + | |
| 7104 | + | |
| 7105 | + | |
| 7106 | + | |
| 7107 | + | |
| 7108 | + | |
| 7109 | + | |
| 7110 | + | |
| 7111 | + | |
| 7112 | + | |
| 7113 | + | |
| 7114 | + | |
| 7115 | + | |
| 7116 | + | |
| 7117 | + | |
| 7118 | + | |
| 7119 | + | |
| 7120 | + | |
| 7121 | + | |
| 7122 | + | |
| 7123 | + | |
| 7124 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg" media="(max-width: 991px)"> | |
| 7125 | + | |
| 7126 | + | |
| 7127 | + | |
| 7128 | + | |
| 7129 | + | |
| 7130 | + | |
| 7131 | + | |
| 7132 | + | |
| 7133 | + | |
| 7134 | + | |
| 7135 | + | |
| 7136 | + | |
| 7137 | + | |
| 7138 | + | |
| 7139 | + | |
| 7140 | + | |
| 7141 | + | |
| 7142 | + | |
| 7143 | + | |
| 7144 | + | |
| 7145 | + | |
| 7146 | + | |
| 7147 | + | |
| 7148 | + | |
| 7149 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg" media="(max-width: 1199px)"> | |
| 7150 | + | |
| 7151 | + | |
| 7152 | + | |
| 7153 | + | |
| 7154 | + | |
| 7155 | + | |
| 7156 | + | |
| 7157 | + | |
| 7158 | + | |
| 7159 | + | |
| 7160 | + | |
| 7161 | + | |
| 7162 | + | |
| 7163 | + | |
| 7164 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg" media="(min-width: 1200px)"> | |
| 7165 | + | |
| 7166 | + | |
| 7167 | + | |
| 7168 | + | |
| 7169 | + <img src='/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg' srcset='/content/dam/bnc/particuliers/img/375x195/img-rent-buy-375x195.jpg' data-websites-component="/components/textandimage/image" alt="Illustration of house with thought bubble saying rent or buy" data-picture-alttext-lg="Illustration of house with thought bubble saying rent or buy" data-picture-alttext-md="Illustration of house with thought bubble saying rent or buy" data-picture-alttext-sm="Illustration of house with thought bubble saying rent or buy" data-picture-alttext-xs="Illustration of house with thought bubble saying rent or buy" class="center-block image-responsive"> | |
| 7170 | + </picture> | |
| 7171 | + | |
| 7172 | + | |
| 7173 | + | |
| 7174 | + <script type="text/javascript"> | |
| 7175 | + | |
| 7176 | + var Websites = Websites || {}; | |
| 7177 | + Websites.FragmentPicture = Websites.FragmentPicture || { | |
| 7178 | + init: function(viewport) { | |
| 7179 | + Websites.FragmentPicture.loadAlternativeText(viewport); | |
| 7180 | + }, | |
| 7181 | + | |
| 7182 | + loadAlternativeText: function(viewport) { | |
| 7183 | + $('[data-websites-component="/components/textandimage/image"]').each(function(){ | |
| 7184 | + if(viewport.is("xs") ) { | |
| 7185 | + $(this).attr("alt", $(this).data("picture-alttext-xs")); | |
| 7186 | + } else if(viewport.is("sm") ) { | |
| 7187 | + $(this).attr("alt", $(this).data("picture-alttext-sm")); | |
| 7188 | + } else if(viewport.is("md") ) { | |
| 7189 | + $(this).attr("alt", $(this).data("picture-alttext-md")); | |
| 7190 | + } else if(viewport.is("lg") ) { | |
| 7191 | + $(this).attr("alt", $(this).data("picture-alttext-lg")); | |
| 7192 | + } | |
| 7193 | + }); | |
| 7194 | + } | |
| 7195 | + }; | |
| 7196 | + | |
| 7197 | + $(document).ready(function(){ | |
| 7198 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 7199 | + }); | |
| 7200 | + | |
| 7201 | + Websites.Events.onBreakpointChanged(function(){ | |
| 7202 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 7203 | + }); | |
| 7204 | + </script> | |
| 7205 | + | |
| 7206 | + | |
| 7207 | + | |
| 7208 | + | |
| 7209 | + | |
| 7210 | + </div> | |
| 7211 | + | |
| 7212 | + | |
| 7213 | + | |
| 7214 | +</div> | |
| 7215 | +<div | |
| 7216 | + class="col-xs-12 text-image-text-container " | |
| 7217 | + | |
| 7218 | + data-websites-component="/components/textandimage/text" | |
| 7219 | + data-text-image-text-container-style-xs="{'padding-top': '0px'}" | |
| 7220 | + data-text-image-text-container-style-sm="{'padding-top': '0px'}" | |
| 7221 | + data-text-image-text-container-style-md="{'padding-top': '0px'}" | |
| 7222 | + data-text-image-text-container-style-lg="{'padding-top': '0px'}"><p style="text-align: center;"><b>Rent or buy?</b><br> | |
| 7223 | +</p> | |
| 7224 | +<p style="text-align: center;">Find out if it's more profitable for you to buy or rent.<br> | |
| 7225 | +</p> | |
| 7226 | +</div> | |
| 7227 | + | |
| 7228 | + | |
| 7229 | + | |
| 7230 | + | |
| 7231 | + | |
| 7232 | + | |
| 7233 | + | |
| 7234 | + | |
| 7235 | + | |
| 7236 | + </div> | |
| 7237 | + | |
| 7238 | + | |
| 7239 | + | |
| 7240 | + | |
| 7241 | + | |
| 7242 | + | |
| 7243 | + | |
| 7244 | + | |
| 7245 | + | |
| 7246 | + | |
| 7247 | + | |
| 7248 | + | |
| 7249 | + <script> | |
| 7250 | + | |
| 7251 | + (function(){ | |
| 7252 | + | |
| 7253 | + var dataLayerViewEventName = '' || ''; | |
| 7254 | + var dataLayerViewLayerProperties = []; | |
| 7255 | + var $el; | |
| 7256 | + | |
| 7257 | + | |
| 7258 | + | |
| 7259 | + if(dataLayerViewEventName.trim().length) { | |
| 7260 | + | |
| 7261 | + var obj = { | |
| 7262 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 7263 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys3_panelcontainer_1423965634_parsys_textandimage_7231150" , | |
| 7264 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 7265 | + }; | |
| 7266 | + | |
| 7267 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 7268 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 7269 | + if(document.currentScript){ | |
| 7270 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 7271 | + } else { | |
| 7272 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 7273 | + var currentScript = scripts[scripts.length - 1]; | |
| 7274 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 7275 | + } | |
| 7276 | + | |
| 7277 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 7278 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 7279 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 7280 | + | |
| 7281 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 7282 | + | |
| 7283 | + } | |
| 7284 | + | |
| 7285 | + })(); | |
| 7286 | + | |
| 7287 | + </script> | |
| 7288 | + | |
| 7289 | +</div> | |
| 7290 | + | |
| 7291 | + <script> | |
| 7292 | + | |
| 7293 | + /** | |
| 7294 | + * clickEventDownloadHandler() | |
| 7295 | + * Is used to handle download image action selected as an opening mode | |
| 7296 | + * | |
| 7297 | + */ | |
| 7298 | + | |
| 7299 | + var firstDownload = true; | |
| 7300 | + | |
| 7301 | + function clickEventDownloadHandler() { | |
| 7302 | + | |
| 7303 | + var link = this; | |
| 7304 | + var filename = link.dataset.linkpath; | |
| 7305 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 7306 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 7307 | + | |
| 7308 | + if (newFile) { | |
| 7309 | + | |
| 7310 | + if (firstDownload) { | |
| 7311 | + firstDownload = false; | |
| 7312 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 7313 | + } else { | |
| 7314 | + this.href = link.href; | |
| 7315 | + } | |
| 7316 | + | |
| 7317 | + this.download = fn; | |
| 7318 | + | |
| 7319 | + } else { | |
| 7320 | + this.download = fn + ".html"; | |
| 7321 | + } | |
| 7322 | + } | |
| 7323 | + | |
| 7324 | + </script></div> | |
| 7325 | +<div class="textandimage parbase section"> | |
| 7326 | + | |
| 7327 | + | |
| 7328 | + | |
| 7329 | + | |
| 7330 | + | |
| 7331 | + | |
| 7332 | + | |
| 7333 | + | |
| 7334 | + | |
| 7335 | + | |
| 7336 | + | |
| 7337 | + | |
| 7338 | + | |
| 7339 | + | |
| 7340 | + | |
| 7341 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys3_panelcontainer_1423965634_parsys_textandimage_copy_co" class="text-image-container " | |
| 7342 | + data-text-image-container-right-left="false"> | |
| 7343 | + | |
| 7344 | + | |
| 7345 | + | |
| 7346 | + | |
| 7347 | + | |
| 7348 | + | |
| 7349 | + | |
| 7350 | + | |
| 7351 | + | |
| 7352 | + <div class="row text-image-row" | |
| 7353 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 7354 | + | |
| 7355 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 7356 | + | |
| 7357 | + | |
| 7358 | + | |
| 7359 | + | |
| 7360 | + | |
| 7361 | + data-text-image-rowcontainer-height-lg="0" | |
| 7362 | + data-text-image-rowcontainer-width-lg="0" | |
| 7363 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 7364 | + | |
| 7365 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 7366 | + | |
| 7367 | + | |
| 7368 | + | |
| 7369 | + | |
| 7370 | + | |
| 7371 | + data-text-image-rowcontainer-height-md="0" | |
| 7372 | + data-text-image-rowcontainer-width-md="0" | |
| 7373 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 7374 | + | |
| 7375 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 7376 | + | |
| 7377 | + | |
| 7378 | + | |
| 7379 | + | |
| 7380 | + | |
| 7381 | + data-text-image-rowcontainer-height-sm="0" | |
| 7382 | + data-text-image-rowcontainer-width-sm="0" | |
| 7383 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 7384 | + | |
| 7385 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 7386 | + | |
| 7387 | + | |
| 7388 | + | |
| 7389 | + | |
| 7390 | + | |
| 7391 | + data-text-image-rowcontainer-height-xs="0" | |
| 7392 | + data-text-image-rowcontainer-width-xs="0" | |
| 7393 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 7394 | + | |
| 7395 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/calculators/rent-or-buy.html" target="_blank" hrefnoextension="false">Take the test</a></p> | |
| 7396 | +</div> | |
| 7397 | + </div> | |
| 7398 | + | |
| 7399 | + | |
| 7400 | + | |
| 7401 | + | |
| 7402 | + | |
| 7403 | + | |
| 7404 | + | |
| 7405 | + | |
| 7406 | + | |
| 7407 | + | |
| 7408 | + | |
| 7409 | + <script> | |
| 7410 | + | |
| 7411 | + (function(){ | |
| 7412 | + | |
| 7413 | + var dataLayerViewEventName = '' || ''; | |
| 7414 | + var dataLayerViewLayerProperties = []; | |
| 7415 | + var $el; | |
| 7416 | + | |
| 7417 | + | |
| 7418 | + | |
| 7419 | + if(dataLayerViewEventName.trim().length) { | |
| 7420 | + | |
| 7421 | + var obj = { | |
| 7422 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 7423 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys3_panelcontainer_1423965634_parsys_textandimage_copy_co" , | |
| 7424 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 7425 | + }; | |
| 7426 | + | |
| 7427 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 7428 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 7429 | + if(document.currentScript){ | |
| 7430 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 7431 | + } else { | |
| 7432 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 7433 | + var currentScript = scripts[scripts.length - 1]; | |
| 7434 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 7435 | + } | |
| 7436 | + | |
| 7437 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 7438 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 7439 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 7440 | + | |
| 7441 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 7442 | + | |
| 7443 | + } | |
| 7444 | + | |
| 7445 | + })(); | |
| 7446 | + | |
| 7447 | + </script> | |
| 7448 | + | |
| 7449 | +</div> | |
| 7450 | + | |
| 7451 | + <script> | |
| 7452 | + | |
| 7453 | + /** | |
| 7454 | + * clickEventDownloadHandler() | |
| 7455 | + * Is used to handle download image action selected as an opening mode | |
| 7456 | + * | |
| 7457 | + */ | |
| 7458 | + | |
| 7459 | + var firstDownload = true; | |
| 7460 | + | |
| 7461 | + function clickEventDownloadHandler() { | |
| 7462 | + | |
| 7463 | + var link = this; | |
| 7464 | + var filename = link.dataset.linkpath; | |
| 7465 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 7466 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 7467 | + | |
| 7468 | + if (newFile) { | |
| 7469 | + | |
| 7470 | + if (firstDownload) { | |
| 7471 | + firstDownload = false; | |
| 7472 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 7473 | + } else { | |
| 7474 | + this.href = link.href; | |
| 7475 | + } | |
| 7476 | + | |
| 7477 | + this.download = fn; | |
| 7478 | + | |
| 7479 | + } else { | |
| 7480 | + this.download = fn + ".html"; | |
| 7481 | + } | |
| 7482 | + } | |
| 7483 | + | |
| 7484 | + </script></div> | |
| 7485 | + | |
| 7486 | +</div> | |
| 7487 | + | |
| 7488 | +</div> | |
| 7489 | + | |
| 7490 | + | |
| 7491 | + | |
| 7492 | +<!--/* Initialize Js */--> | |
| 7493 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys3/panelcontainer_1423965634"> | |
| 7494 | + if(""){ | |
| 7495 | + new Websites.Sticky({ | |
| 7496 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys3/panelcontainer_1423965634", | |
| 7497 | + breakpoint: { | |
| 7498 | + lg: { | |
| 7499 | + to: "" | |
| 7500 | + }, | |
| 7501 | + md: { | |
| 7502 | + to: "" | |
| 7503 | + }, | |
| 7504 | + sm: { | |
| 7505 | + to: "", | |
| 7506 | + }, | |
| 7507 | + xs: { | |
| 7508 | + to: "" | |
| 7509 | + } | |
| 7510 | + } | |
| 7511 | + }); | |
| 7512 | + } | |
| 7513 | +</script> | |
| 7514 | + | |
| 7515 | +</div> | |
| 7516 | +</div> | |
| 7517 | + | |
| 7518 | +</div> | |
| 7519 | + | |
| 7520 | + </div> | |
| 7521 | + | |
| 7522 | + <div class="col-xs-12 col-sm-3 column col-last "> | |
| 7523 | + <div class="parsys4 parsys"><div class="panelContainer section"> | |
| 7524 | + | |
| 7525 | + | |
| 7526 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 7527 | + | |
| 7528 | + | |
| 7529 | + | |
| 7530 | + <div> | |
| 7531 | + | |
| 7532 | + | |
| 7533 | + | |
| 7534 | + | |
| 7535 | + | |
| 7536 | + | |
| 7537 | + | |
| 7538 | + | |
| 7539 | + | |
| 7540 | + | |
| 7541 | + | |
| 7542 | + | |
| 7543 | + | |
| 7544 | + | |
| 7545 | + | |
| 7546 | + | |
| 7547 | + | |
| 7548 | + | |
| 7549 | + | |
| 7550 | + | |
| 7551 | + | |
| 7552 | + | |
| 7553 | + | |
| 7554 | +<div class="panelContainer " | |
| 7555 | + | |
| 7556 | + | |
| 7557 | + data-websites-component="/components/panelContainer.v1" | |
| 7558 | + data-panel-container-lg-mg="1% 2% 0 2%" | |
| 7559 | + data-panel-container-lg-pd="" | |
| 7560 | + data-panel-container-lg-ht="" | |
| 7561 | + data-panel-container-md-mg="1% 2% 0 2%" | |
| 7562 | + data-panel-container-md-pd="" | |
| 7563 | + data-panel-container-md-ht="" | |
| 7564 | + data-panel-container-sm-mg="1% 2% 0 2%" | |
| 7565 | + data-panel-container-sm-pd="" | |
| 7566 | + data-panel-container-sm-ht="" | |
| 7567 | + data-panel-container-xs-mg="1% 2% 0 2%" | |
| 7568 | + data-panel-container-xs-pd="" | |
| 7569 | + data-panel-container-xs-ht="" | |
| 7570 | + data-panel-container-limit=""> | |
| 7571 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 7572 | + | |
| 7573 | + | |
| 7574 | + | |
| 7575 | + | |
| 7576 | + | |
| 7577 | + | |
| 7578 | + | |
| 7579 | + | |
| 7580 | + | |
| 7581 | + | |
| 7582 | + | |
| 7583 | + | |
| 7584 | + | |
| 7585 | + | |
| 7586 | + | |
| 7587 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys4_panelcontainer_copy__parsys_textandimage_723115041" class="text-image-container " | |
| 7588 | + data-text-image-container-right-left="false"> | |
| 7589 | + | |
| 7590 | + | |
| 7591 | + | |
| 7592 | + | |
| 7593 | + | |
| 7594 | + | |
| 7595 | + | |
| 7596 | + | |
| 7597 | + | |
| 7598 | + <div class="row text-image-row" | |
| 7599 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 7600 | + | |
| 7601 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 7602 | + | |
| 7603 | + | |
| 7604 | + | |
| 7605 | + | |
| 7606 | + | |
| 7607 | + data-text-image-rowcontainer-height-lg="0" | |
| 7608 | + data-text-image-rowcontainer-width-lg="0" | |
| 7609 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 7610 | + | |
| 7611 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 7612 | + | |
| 7613 | + | |
| 7614 | + | |
| 7615 | + | |
| 7616 | + | |
| 7617 | + data-text-image-rowcontainer-height-md="0" | |
| 7618 | + data-text-image-rowcontainer-width-md="0" | |
| 7619 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 7620 | + | |
| 7621 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 7622 | + | |
| 7623 | + | |
| 7624 | + | |
| 7625 | + | |
| 7626 | + | |
| 7627 | + data-text-image-rowcontainer-height-sm="0" | |
| 7628 | + data-text-image-rowcontainer-width-sm="0" | |
| 7629 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 7630 | + | |
| 7631 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 7632 | + | |
| 7633 | + | |
| 7634 | + | |
| 7635 | + | |
| 7636 | + | |
| 7637 | + data-text-image-rowcontainer-height-xs="0" | |
| 7638 | + data-text-image-rowcontainer-width-xs="0" | |
| 7639 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 7640 | + | |
| 7641 | + | |
| 7642 | + | |
| 7643 | + | |
| 7644 | + | |
| 7645 | + | |
| 7646 | + | |
| 7647 | + | |
| 7648 | + | |
| 7649 | + | |
| 7650 | + | |
| 7651 | + | |
| 7652 | + | |
| 7653 | + | |
| 7654 | + <div class="col-xs-12 text-image-image-container" > | |
| 7655 | + | |
| 7656 | + | |
| 7657 | + | |
| 7658 | + <div> | |
| 7659 | + | |
| 7660 | + | |
| 7661 | + | |
| 7662 | + | |
| 7663 | + | |
| 7664 | + | |
| 7665 | + <picture> | |
| 7666 | + | |
| 7667 | + | |
| 7668 | + | |
| 7669 | + | |
| 7670 | + | |
| 7671 | + | |
| 7672 | + | |
| 7673 | + | |
| 7674 | + | |
| 7675 | + | |
| 7676 | + | |
| 7677 | + | |
| 7678 | + | |
| 7679 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg" media="(max-width: 767px)"> | |
| 7680 | + | |
| 7681 | + | |
| 7682 | + | |
| 7683 | + | |
| 7684 | + | |
| 7685 | + | |
| 7686 | + | |
| 7687 | + | |
| 7688 | + | |
| 7689 | + | |
| 7690 | + | |
| 7691 | + | |
| 7692 | + | |
| 7693 | + | |
| 7694 | + | |
| 7695 | + | |
| 7696 | + | |
| 7697 | + | |
| 7698 | + | |
| 7699 | + | |
| 7700 | + | |
| 7701 | + | |
| 7702 | + | |
| 7703 | + | |
| 7704 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg" media="(max-width: 991px)"> | |
| 7705 | + | |
| 7706 | + | |
| 7707 | + | |
| 7708 | + | |
| 7709 | + | |
| 7710 | + | |
| 7711 | + | |
| 7712 | + | |
| 7713 | + | |
| 7714 | + | |
| 7715 | + | |
| 7716 | + | |
| 7717 | + | |
| 7718 | + | |
| 7719 | + | |
| 7720 | + | |
| 7721 | + | |
| 7722 | + | |
| 7723 | + | |
| 7724 | + | |
| 7725 | + | |
| 7726 | + | |
| 7727 | + | |
| 7728 | + | |
| 7729 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg" media="(max-width: 1199px)"> | |
| 7730 | + | |
| 7731 | + | |
| 7732 | + | |
| 7733 | + | |
| 7734 | + | |
| 7735 | + | |
| 7736 | + | |
| 7737 | + | |
| 7738 | + | |
| 7739 | + | |
| 7740 | + | |
| 7741 | + | |
| 7742 | + | |
| 7743 | + | |
| 7744 | + <source srcset="/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg" media="(min-width: 1200px)"> | |
| 7745 | + | |
| 7746 | + | |
| 7747 | + | |
| 7748 | + | |
| 7749 | + <img src='/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg' srcset='/content/dam/bnc/particuliers/img/375x195/img-montants-versements-375x195.jpg' data-websites-component="/components/textandimage/image" alt="Picto of a calculator and calendar with the National Bank logo in the background" data-picture-alttext-lg="Picto of a calculator and calendar with the National Bank logo in the background" data-picture-alttext-md="Picto of a calculator and calendar with the National Bank logo in the background" data-picture-alttext-sm="Picto of a calculator and calendar with the National Bank logo in the background" data-picture-alttext-xs="Picto of a calculator and calendar with the National Bank logo in the background" class="center-block image-responsive"> | |
| 7750 | + </picture> | |
| 7751 | + | |
| 7752 | + | |
| 7753 | + | |
| 7754 | + <script type="text/javascript"> | |
| 7755 | + | |
| 7756 | + var Websites = Websites || {}; | |
| 7757 | + Websites.FragmentPicture = Websites.FragmentPicture || { | |
| 7758 | + init: function(viewport) { | |
| 7759 | + Websites.FragmentPicture.loadAlternativeText(viewport); | |
| 7760 | + }, | |
| 7761 | + | |
| 7762 | + loadAlternativeText: function(viewport) { | |
| 7763 | + $('[data-websites-component="/components/textandimage/image"]').each(function(){ | |
| 7764 | + if(viewport.is("xs") ) { | |
| 7765 | + $(this).attr("alt", $(this).data("picture-alttext-xs")); | |
| 7766 | + } else if(viewport.is("sm") ) { | |
| 7767 | + $(this).attr("alt", $(this).data("picture-alttext-sm")); | |
| 7768 | + } else if(viewport.is("md") ) { | |
| 7769 | + $(this).attr("alt", $(this).data("picture-alttext-md")); | |
| 7770 | + } else if(viewport.is("lg") ) { | |
| 7771 | + $(this).attr("alt", $(this).data("picture-alttext-lg")); | |
| 7772 | + } | |
| 7773 | + }); | |
| 7774 | + } | |
| 7775 | + }; | |
| 7776 | + | |
| 7777 | + $(document).ready(function(){ | |
| 7778 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 7779 | + }); | |
| 7780 | + | |
| 7781 | + Websites.Events.onBreakpointChanged(function(){ | |
| 7782 | + Websites.FragmentPicture.loadAlternativeText(ResponsiveBootstrapToolkit); | |
| 7783 | + }); | |
| 7784 | + </script> | |
| 7785 | + | |
| 7786 | + | |
| 7787 | + | |
| 7788 | + | |
| 7789 | + | |
| 7790 | + </div> | |
| 7791 | + | |
| 7792 | + | |
| 7793 | + | |
| 7794 | +</div> | |
| 7795 | +<div | |
| 7796 | + class="col-xs-12 text-image-text-container " | |
| 7797 | + | |
| 7798 | + data-websites-component="/components/textandimage/text" | |
| 7799 | + data-text-image-text-container-style-xs="{'padding-top': '0px'}" | |
| 7800 | + data-text-image-text-container-style-sm="{'padding-top': '0px'}" | |
| 7801 | + data-text-image-text-container-style-md="{'padding-top': '0px'}" | |
| 7802 | + data-text-image-text-container-style-lg="{'padding-top': '0px'}"><p style="text-align: center;"><b>Calculate your renewal payments</b><br> | |
| 7803 | +</p> | |
| 7804 | +<p style="text-align: center;">Is your mortgage renewal approaching, and you want to calculate your budget? Learn the amount and frequency of your mortgage payments while still being able to save each month.<br> | |
| 7805 | +</p> | |
| 7806 | +<p class="pvariant3" style="text-align: center;"><a role="button" tabindex="0" onkeyup="if(event.key === ' ') this.click();" href="/personal/mortgages/calculators/renewal-payments.html" target="_blank" hrefnoextension="false">Calculate my payments</a><br> | |
| 7807 | +</p> | |
| 7808 | +</div> | |
| 7809 | + | |
| 7810 | + | |
| 7811 | + | |
| 7812 | + | |
| 7813 | + | |
| 7814 | + | |
| 7815 | + | |
| 7816 | + | |
| 7817 | + | |
| 7818 | + </div> | |
| 7819 | + | |
| 7820 | + | |
| 7821 | + | |
| 7822 | + | |
| 7823 | + | |
| 7824 | + | |
| 7825 | + | |
| 7826 | + | |
| 7827 | + | |
| 7828 | + | |
| 7829 | + | |
| 7830 | + | |
| 7831 | + <script> | |
| 7832 | + | |
| 7833 | + (function(){ | |
| 7834 | + | |
| 7835 | + var dataLayerViewEventName = '' || ''; | |
| 7836 | + var dataLayerViewLayerProperties = []; | |
| 7837 | + var $el; | |
| 7838 | + | |
| 7839 | + | |
| 7840 | + | |
| 7841 | + if(dataLayerViewEventName.trim().length) { | |
| 7842 | + | |
| 7843 | + var obj = { | |
| 7844 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 7845 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_parsys_panelcontainer_parsys_panelcontainer_82860_parsys_columns_copy_parsys4_panelcontainer_copy__parsys_textandimage_723115041" , | |
| 7846 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 7847 | + }; | |
| 7848 | + | |
| 7849 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 7850 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 7851 | + if(document.currentScript){ | |
| 7852 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 7853 | + } else { | |
| 7854 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 7855 | + var currentScript = scripts[scripts.length - 1]; | |
| 7856 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 7857 | + } | |
| 7858 | + | |
| 7859 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 7860 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 7861 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 7862 | + | |
| 7863 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 7864 | + | |
| 7865 | + } | |
| 7866 | + | |
| 7867 | + })(); | |
| 7868 | + | |
| 7869 | + </script> | |
| 7870 | + | |
| 7871 | +</div> | |
| 7872 | + | |
| 7873 | + <script> | |
| 7874 | + | |
| 7875 | + /** | |
| 7876 | + * clickEventDownloadHandler() | |
| 7877 | + * Is used to handle download image action selected as an opening mode | |
| 7878 | + * | |
| 7879 | + */ | |
| 7880 | + | |
| 7881 | + var firstDownload = true; | |
| 7882 | + | |
| 7883 | + function clickEventDownloadHandler() { | |
| 7884 | + | |
| 7885 | + var link = this; | |
| 7886 | + var filename = link.dataset.linkpath; | |
| 7887 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 7888 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 7889 | + | |
| 7890 | + if (newFile) { | |
| 7891 | + | |
| 7892 | + if (firstDownload) { | |
| 7893 | + firstDownload = false; | |
| 7894 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 7895 | + } else { | |
| 7896 | + this.href = link.href; | |
| 7897 | + } | |
| 7898 | + | |
| 7899 | + this.download = fn; | |
| 7900 | + | |
| 7901 | + } else { | |
| 7902 | + this.download = fn + ".html"; | |
| 7903 | + } | |
| 7904 | + } | |
| 7905 | + | |
| 7906 | + </script></div> | |
| 7907 | + | |
| 7908 | +</div> | |
| 7909 | + | |
| 7910 | +</div> | |
| 7911 | + | |
| 7912 | + | |
| 7913 | + | |
| 7914 | +<!--/* Initialize Js */--> | |
| 7915 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys4/panelcontainer_copy_"> | |
| 7916 | + if(""){ | |
| 7917 | + new Websites.Sticky({ | |
| 7918 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860/parsys/columns_copy/parsys4/panelcontainer_copy_", | |
| 7919 | + breakpoint: { | |
| 7920 | + lg: { | |
| 7921 | + to: "" | |
| 7922 | + }, | |
| 7923 | + md: { | |
| 7924 | + to: "" | |
| 7925 | + }, | |
| 7926 | + sm: { | |
| 7927 | + to: "", | |
| 7928 | + }, | |
| 7929 | + xs: { | |
| 7930 | + to: "" | |
| 7931 | + } | |
| 7932 | + } | |
| 7933 | + }); | |
| 7934 | + } | |
| 7935 | +</script> | |
| 7936 | + | |
| 7937 | +</div> | |
| 7938 | +</div> | |
| 7939 | + | |
| 7940 | +</div> | |
| 7941 | + | |
| 7942 | + </div> | |
| 7943 | + | |
| 7944 | + </div> | |
| 7945 | + | |
| 7946 | + | |
| 7947 | + | |
| 7948 | +</div> | |
| 7949 | + | |
| 7950 | +</div> | |
| 7951 | + | |
| 7952 | +</div> | |
| 7953 | + | |
| 7954 | + | |
| 7955 | + | |
| 7956 | +<!--/* Initialize Js */--> | |
| 7957 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860"> | |
| 7958 | + if(""){ | |
| 7959 | + new Websites.Sticky({ | |
| 7960 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer/parsys/panelcontainer_82860", | |
| 7961 | + breakpoint: { | |
| 7962 | + lg: { | |
| 7963 | + to: "none" | |
| 7964 | + }, | |
| 7965 | + md: { | |
| 7966 | + to: "none" | |
| 7967 | + }, | |
| 7968 | + sm: { | |
| 7969 | + to: "none", | |
| 7970 | + }, | |
| 7971 | + xs: { | |
| 7972 | + to: "none" | |
| 7973 | + } | |
| 7974 | + } | |
| 7975 | + }); | |
| 7976 | + } | |
| 7977 | +</script> | |
| 7978 | + | |
| 7979 | +</div> | |
| 7980 | +</div> | |
| 7981 | + | |
| 7982 | +</div> | |
| 7983 | + | |
| 7984 | +</div> | |
| 7985 | + | |
| 7986 | + | |
| 7987 | + | |
| 7988 | +<!--/* Initialize Js */--> | |
| 7989 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer"> | |
| 7990 | + if(""){ | |
| 7991 | + new Websites.Sticky({ | |
| 7992 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer/parsys/panelcontainer", | |
| 7993 | + breakpoint: { | |
| 7994 | + lg: { | |
| 7995 | + to: "none" | |
| 7996 | + }, | |
| 7997 | + md: { | |
| 7998 | + to: "none" | |
| 7999 | + }, | |
| 8000 | + sm: { | |
| 8001 | + to: "none", | |
| 8002 | + }, | |
| 8003 | + xs: { | |
| 8004 | + to: "none" | |
| 8005 | + } | |
| 8006 | + } | |
| 8007 | + }); | |
| 8008 | + } | |
| 8009 | +</script> | |
| 8010 | + | |
| 8011 | +</div> | |
| 8012 | +</div> | |
| 8013 | + | |
| 8014 | +</div> | |
| 8015 | + | |
| 8016 | +</div> | |
| 8017 | + | |
| 8018 | + | |
| 8019 | + | |
| 8020 | +<!--/* Initialize Js */--> | |
| 8021 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer"> | |
| 8022 | + if(""){ | |
| 8023 | + new Websites.Sticky({ | |
| 8024 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer", | |
| 8025 | + breakpoint: { | |
| 8026 | + lg: { | |
| 8027 | + to: "" | |
| 8028 | + }, | |
| 8029 | + md: { | |
| 8030 | + to: "" | |
| 8031 | + }, | |
| 8032 | + sm: { | |
| 8033 | + to: "", | |
| 8034 | + }, | |
| 8035 | + xs: { | |
| 8036 | + to: "" | |
| 8037 | + } | |
| 8038 | + } | |
| 8039 | + }); | |
| 8040 | + } | |
| 8041 | +</script> | |
| 8042 | + | |
| 8043 | +</div> | |
| 8044 | +</div> | |
| 8045 | +<div class="panelContainer section"> | |
| 8046 | + | |
| 8047 | + | |
| 8048 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 8049 | + | |
| 8050 | + | |
| 8051 | + | |
| 8052 | + <div> | |
| 8053 | + | |
| 8054 | + | |
| 8055 | + | |
| 8056 | + | |
| 8057 | + | |
| 8058 | + | |
| 8059 | + | |
| 8060 | + | |
| 8061 | + | |
| 8062 | + | |
| 8063 | + | |
| 8064 | + | |
| 8065 | + | |
| 8066 | + | |
| 8067 | + | |
| 8068 | + | |
| 8069 | + | |
| 8070 | + | |
| 8071 | + | |
| 8072 | + | |
| 8073 | + | |
| 8074 | + | |
| 8075 | + | |
| 8076 | +<div class="panelContainer panelContainerStyle2 " | |
| 8077 | + | |
| 8078 | + | |
| 8079 | + data-websites-component="/components/panelContainer.v1" | |
| 8080 | + data-panel-container-lg-mg="" | |
| 8081 | + data-panel-container-lg-pd="" | |
| 8082 | + data-panel-container-lg-ht="" | |
| 8083 | + data-panel-container-md-mg="" | |
| 8084 | + data-panel-container-md-pd="" | |
| 8085 | + data-panel-container-md-ht="" | |
| 8086 | + data-panel-container-sm-mg="" | |
| 8087 | + data-panel-container-sm-pd="" | |
| 8088 | + data-panel-container-sm-ht="" | |
| 8089 | + data-panel-container-xs-mg="" | |
| 8090 | + data-panel-container-xs-pd="" | |
| 8091 | + data-panel-container-xs-ht="" | |
| 8092 | + data-panel-container-limit=""> | |
| 8093 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 8094 | + | |
| 8095 | + | |
| 8096 | + | |
| 8097 | + | |
| 8098 | + | |
| 8099 | + | |
| 8100 | + | |
| 8101 | + | |
| 8102 | + | |
| 8103 | + | |
| 8104 | + | |
| 8105 | + | |
| 8106 | + | |
| 8107 | + | |
| 8108 | + | |
| 8109 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_textandimage" class="text-image-container " | |
| 8110 | + data-text-image-container-right-left="false"> | |
| 8111 | + | |
| 8112 | + | |
| 8113 | + | |
| 8114 | + | |
| 8115 | + | |
| 8116 | + | |
| 8117 | + | |
| 8118 | + | |
| 8119 | + | |
| 8120 | + <div class="row text-image-row" | |
| 8121 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 8122 | + | |
| 8123 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 8124 | + | |
| 8125 | + | |
| 8126 | + | |
| 8127 | + | |
| 8128 | + | |
| 8129 | + data-text-image-rowcontainer-height-lg="0" | |
| 8130 | + data-text-image-rowcontainer-width-lg="0" | |
| 8131 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 8132 | + | |
| 8133 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 8134 | + | |
| 8135 | + | |
| 8136 | + | |
| 8137 | + | |
| 8138 | + | |
| 8139 | + data-text-image-rowcontainer-height-md="0" | |
| 8140 | + data-text-image-rowcontainer-width-md="0" | |
| 8141 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 8142 | + | |
| 8143 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 8144 | + | |
| 8145 | + | |
| 8146 | + | |
| 8147 | + | |
| 8148 | + | |
| 8149 | + data-text-image-rowcontainer-height-sm="0" | |
| 8150 | + data-text-image-rowcontainer-width-sm="0" | |
| 8151 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 8152 | + | |
| 8153 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 8154 | + | |
| 8155 | + | |
| 8156 | + | |
| 8157 | + | |
| 8158 | + | |
| 8159 | + data-text-image-rowcontainer-height-xs="0" | |
| 8160 | + data-text-image-rowcontainer-width-xs="0" | |
| 8161 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 8162 | + | |
| 8163 | + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant1"><a id="fixed"></a><span style="letter-spacing: 0.3px; background-color: transparent;">Fixed-rate loan</span><br> | |
| 8164 | +</h2> | |
| 8165 | +</div> | |
| 8166 | + </div> | |
| 8167 | + | |
| 8168 | + | |
| 8169 | + | |
| 8170 | + | |
| 8171 | + | |
| 8172 | + | |
| 8173 | + | |
| 8174 | + | |
| 8175 | + | |
| 8176 | + | |
| 8177 | + | |
| 8178 | + <script> | |
| 8179 | + | |
| 8180 | + (function(){ | |
| 8181 | + | |
| 8182 | + var dataLayerViewEventName = '' || ''; | |
| 8183 | + var dataLayerViewLayerProperties = []; | |
| 8184 | + var $el; | |
| 8185 | + | |
| 8186 | + | |
| 8187 | + | |
| 8188 | + if(dataLayerViewEventName.trim().length) { | |
| 8189 | + | |
| 8190 | + var obj = { | |
| 8191 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 8192 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_textandimage" , | |
| 8193 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 8194 | + }; | |
| 8195 | + | |
| 8196 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 8197 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 8198 | + if(document.currentScript){ | |
| 8199 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 8200 | + } else { | |
| 8201 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 8202 | + var currentScript = scripts[scripts.length - 1]; | |
| 8203 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 8204 | + } | |
| 8205 | + | |
| 8206 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 8207 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 8208 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 8209 | + | |
| 8210 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 8211 | + | |
| 8212 | + } | |
| 8213 | + | |
| 8214 | + })(); | |
| 8215 | + | |
| 8216 | + </script> | |
| 8217 | + | |
| 8218 | +</div> | |
| 8219 | + | |
| 8220 | + <script> | |
| 8221 | + | |
| 8222 | + /** | |
| 8223 | + * clickEventDownloadHandler() | |
| 8224 | + * Is used to handle download image action selected as an opening mode | |
| 8225 | + * | |
| 8226 | + */ | |
| 8227 | + | |
| 8228 | + var firstDownload = true; | |
| 8229 | + | |
| 8230 | + function clickEventDownloadHandler() { | |
| 8231 | + | |
| 8232 | + var link = this; | |
| 8233 | + var filename = link.dataset.linkpath; | |
| 8234 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 8235 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 8236 | + | |
| 8237 | + if (newFile) { | |
| 8238 | + | |
| 8239 | + if (firstDownload) { | |
| 8240 | + firstDownload = false; | |
| 8241 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 8242 | + } else { | |
| 8243 | + this.href = link.href; | |
| 8244 | + } | |
| 8245 | + | |
| 8246 | + this.download = fn; | |
| 8247 | + | |
| 8248 | + } else { | |
| 8249 | + this.download = fn + ".html"; | |
| 8250 | + } | |
| 8251 | + } | |
| 8252 | + | |
| 8253 | + </script></div> | |
| 8254 | +<div class="panelContainer section"> | |
| 8255 | + | |
| 8256 | + | |
| 8257 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 8258 | + | |
| 8259 | + | |
| 8260 | + | |
| 8261 | + <div> | |
| 8262 | + | |
| 8263 | + | |
| 8264 | + | |
| 8265 | + | |
| 8266 | + | |
| 8267 | + | |
| 8268 | + | |
| 8269 | + | |
| 8270 | + | |
| 8271 | + | |
| 8272 | + | |
| 8273 | + | |
| 8274 | + | |
| 8275 | + | |
| 8276 | + | |
| 8277 | + | |
| 8278 | + | |
| 8279 | + | |
| 8280 | + | |
| 8281 | + | |
| 8282 | + | |
| 8283 | + | |
| 8284 | + | |
| 8285 | +<div class="panelContainer background-none no-pad-collapse at-0173-astuce" | |
| 8286 | + | |
| 8287 | + | |
| 8288 | + data-websites-component="/components/panelContainer.v1" | |
| 8289 | + data-panel-container-lg-mg="1% 20% 0 0" | |
| 8290 | + data-panel-container-lg-pd="" | |
| 8291 | + data-panel-container-lg-ht="" | |
| 8292 | + data-panel-container-md-mg="1% 20% 0 0" | |
| 8293 | + data-panel-container-md-pd="" | |
| 8294 | + data-panel-container-md-ht="" | |
| 8295 | + data-panel-container-sm-mg="1% 0 0 0" | |
| 8296 | + data-panel-container-sm-pd="" | |
| 8297 | + data-panel-container-sm-ht="" | |
| 8298 | + data-panel-container-xs-mg="1% 0 0 0" | |
| 8299 | + data-panel-container-xs-pd="" | |
| 8300 | + data-panel-container-xs-ht="" | |
| 8301 | + data-panel-container-limit=""> | |
| 8302 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 8303 | + | |
| 8304 | + | |
| 8305 | + | |
| 8306 | + | |
| 8307 | + | |
| 8308 | + | |
| 8309 | + | |
| 8310 | + | |
| 8311 | + | |
| 8312 | + | |
| 8313 | + | |
| 8314 | + | |
| 8315 | + | |
| 8316 | + | |
| 8317 | + | |
| 8318 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 8319 | + data-text-image-container-right-left="false"> | |
| 8320 | + | |
| 8321 | + | |
| 8322 | + | |
| 8323 | + | |
| 8324 | + | |
| 8325 | + | |
| 8326 | + | |
| 8327 | + | |
| 8328 | + | |
| 8329 | + <div class="row text-image-row" | |
| 8330 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 8331 | + | |
| 8332 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 8333 | + | |
| 8334 | + | |
| 8335 | + | |
| 8336 | + | |
| 8337 | + | |
| 8338 | + data-text-image-rowcontainer-height-lg="0" | |
| 8339 | + data-text-image-rowcontainer-width-lg="0" | |
| 8340 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 8341 | + | |
| 8342 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 8343 | + | |
| 8344 | + | |
| 8345 | + | |
| 8346 | + | |
| 8347 | + | |
| 8348 | + data-text-image-rowcontainer-height-md="0" | |
| 8349 | + data-text-image-rowcontainer-width-md="0" | |
| 8350 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 8351 | + | |
| 8352 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 8353 | + | |
| 8354 | + | |
| 8355 | + | |
| 8356 | + | |
| 8357 | + | |
| 8358 | + data-text-image-rowcontainer-height-sm="0" | |
| 8359 | + data-text-image-rowcontainer-width-sm="0" | |
| 8360 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 8361 | + | |
| 8362 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 8363 | + | |
| 8364 | + | |
| 8365 | + | |
| 8366 | + | |
| 8367 | + | |
| 8368 | + data-text-image-rowcontainer-height-xs="0" | |
| 8369 | + data-text-image-rowcontainer-width-xs="0" | |
| 8370 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 8371 | + | |
| 8372 | + <div class="col-xs-12 text-image-text-container " ><p>Your interest rate is set as soon as you take out your mortgage. This rate is not affected by fluctuations for the duration of your term. This type of rate is only available with a <a href="/personal/mortgages/loan.html" target="_self">mortgage loans</a>.</p> | |
| 8373 | +</div> | |
| 8374 | + </div> | |
| 8375 | + | |
| 8376 | + | |
| 8377 | + | |
| 8378 | + | |
| 8379 | + | |
| 8380 | + | |
| 8381 | + | |
| 8382 | + | |
| 8383 | + | |
| 8384 | + | |
| 8385 | + | |
| 8386 | + <script> | |
| 8387 | + | |
| 8388 | + (function(){ | |
| 8389 | + | |
| 8390 | + var dataLayerViewEventName = '' || ''; | |
| 8391 | + var dataLayerViewLayerProperties = []; | |
| 8392 | + var $el; | |
| 8393 | + | |
| 8394 | + | |
| 8395 | + | |
| 8396 | + if(dataLayerViewEventName.trim().length) { | |
| 8397 | + | |
| 8398 | + var obj = { | |
| 8399 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 8400 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_parsys_textandimage" , | |
| 8401 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 8402 | + }; | |
| 8403 | + | |
| 8404 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 8405 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 8406 | + if(document.currentScript){ | |
| 8407 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 8408 | + } else { | |
| 8409 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 8410 | + var currentScript = scripts[scripts.length - 1]; | |
| 8411 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 8412 | + } | |
| 8413 | + | |
| 8414 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 8415 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 8416 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 8417 | + | |
| 8418 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 8419 | + | |
| 8420 | + } | |
| 8421 | + | |
| 8422 | + })(); | |
| 8423 | + | |
| 8424 | + </script> | |
| 8425 | + | |
| 8426 | +</div> | |
| 8427 | + | |
| 8428 | + <script> | |
| 8429 | + | |
| 8430 | + /** | |
| 8431 | + * clickEventDownloadHandler() | |
| 8432 | + * Is used to handle download image action selected as an opening mode | |
| 8433 | + * | |
| 8434 | + */ | |
| 8435 | + | |
| 8436 | + var firstDownload = true; | |
| 8437 | + | |
| 8438 | + function clickEventDownloadHandler() { | |
| 8439 | + | |
| 8440 | + var link = this; | |
| 8441 | + var filename = link.dataset.linkpath; | |
| 8442 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 8443 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 8444 | + | |
| 8445 | + if (newFile) { | |
| 8446 | + | |
| 8447 | + if (firstDownload) { | |
| 8448 | + firstDownload = false; | |
| 8449 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 8450 | + } else { | |
| 8451 | + this.href = link.href; | |
| 8452 | + } | |
| 8453 | + | |
| 8454 | + this.download = fn; | |
| 8455 | + | |
| 8456 | + } else { | |
| 8457 | + this.download = fn + ".html"; | |
| 8458 | + } | |
| 8459 | + } | |
| 8460 | + | |
| 8461 | + </script></div> | |
| 8462 | +<div class="textandimage parbase section"> | |
| 8463 | + | |
| 8464 | + | |
| 8465 | + | |
| 8466 | + | |
| 8467 | + | |
| 8468 | + | |
| 8469 | + | |
| 8470 | + | |
| 8471 | + | |
| 8472 | + | |
| 8473 | + | |
| 8474 | + | |
| 8475 | + | |
| 8476 | + | |
| 8477 | + | |
| 8478 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_parsys_textandimage_2116172" class="text-image-container " | |
| 8479 | + data-text-image-container-right-left="false"> | |
| 8480 | + | |
| 8481 | + | |
| 8482 | + | |
| 8483 | + | |
| 8484 | + | |
| 8485 | + | |
| 8486 | + | |
| 8487 | + | |
| 8488 | + | |
| 8489 | + <div class="row text-image-row" | |
| 8490 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 8491 | + | |
| 8492 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 8493 | + | |
| 8494 | + | |
| 8495 | + | |
| 8496 | + | |
| 8497 | + | |
| 8498 | + data-text-image-rowcontainer-height-lg="0" | |
| 8499 | + data-text-image-rowcontainer-width-lg="0" | |
| 8500 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 8501 | + | |
| 8502 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 8503 | + | |
| 8504 | + | |
| 8505 | + | |
| 8506 | + | |
| 8507 | + | |
| 8508 | + data-text-image-rowcontainer-height-md="0" | |
| 8509 | + data-text-image-rowcontainer-width-md="0" | |
| 8510 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 8511 | + | |
| 8512 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 8513 | + | |
| 8514 | + | |
| 8515 | + | |
| 8516 | + | |
| 8517 | + | |
| 8518 | + data-text-image-rowcontainer-height-sm="0" | |
| 8519 | + data-text-image-rowcontainer-width-sm="0" | |
| 8520 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 8521 | + | |
| 8522 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 8523 | + | |
| 8524 | + | |
| 8525 | + | |
| 8526 | + | |
| 8527 | + | |
| 8528 | + data-text-image-rowcontainer-height-xs="0" | |
| 8529 | + data-text-image-rowcontainer-width-xs="0" | |
| 8530 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 8531 | + | |
| 8532 | + <div class="col-xs-12 text-image-text-container | |
| 8533 | + initializing" ><p class="pvariant3"><b><br> | |
| 8534 | + Rate (%) as at <span static-token='tauxDateJour|date:"-"'>${p1.tauxDateJour|date:"-"}</span></b></p></div> | |
| 8535 | + </div> | |
| 8536 | + | |
| 8537 | + | |
| 8538 | + | |
| 8539 | + | |
| 8540 | + | |
| 8541 | + | |
| 8542 | + | |
| 8543 | + | |
| 8544 | + | |
| 8545 | + | |
| 8546 | + | |
| 8547 | + | |
| 8548 | + <script> | |
| 8549 | + (function(){ | |
| 8550 | + var $el; | |
| 8551 | + var listeners = []; | |
| 8552 | + var dataLayerViewEventName = ''; | |
| 8553 | + var dataLayerViewLayerProperties = []; | |
| 8554 | + | |
| 8555 | + dataLayerViewEventName = ''; | |
| 8556 | + | |
| 8557 | + | |
| 8558 | + | |
| 8559 | + | |
| 8560 | + | |
| 8561 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 8562 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 8563 | + if(document.currentScript){ | |
| 8564 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 8565 | + } else { | |
| 8566 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 8567 | + var currentScript = scripts[scripts.length - 1]; | |
| 8568 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 8569 | + } | |
| 8570 | + | |
| 8571 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 8572 | + Websites.Product.TextContent.initTextContent({ | |
| 8573 | + $el: $el, | |
| 8574 | + capsuleAlias: "c1", | |
| 8575 | + listeners: listeners, | |
| 8576 | + products: Websites.Product.Core.determineProductsArray("c1"), | |
| 8577 | + dataLayerViewEvent: { | |
| 8578 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 8579 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_parsys_textandimage_2116172" , | |
| 8580 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 8581 | + } | |
| 8582 | + }); | |
| 8583 | + }); | |
| 8584 | + })(); | |
| 8585 | + | |
| 8586 | + </script> | |
| 8587 | + | |
| 8588 | + | |
| 8589 | + | |
| 8590 | + | |
| 8591 | + | |
| 8592 | +</div> | |
| 8593 | + | |
| 8594 | + <script> | |
| 8595 | + | |
| 8596 | + /** | |
| 8597 | + * clickEventDownloadHandler() | |
| 8598 | + * Is used to handle download image action selected as an opening mode | |
| 8599 | + * | |
| 8600 | + */ | |
| 8601 | + | |
| 8602 | + var firstDownload = true; | |
| 8603 | + | |
| 8604 | + function clickEventDownloadHandler() { | |
| 8605 | + | |
| 8606 | + var link = this; | |
| 8607 | + var filename = link.dataset.linkpath; | |
| 8608 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 8609 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 8610 | + | |
| 8611 | + if (newFile) { | |
| 8612 | + | |
| 8613 | + if (firstDownload) { | |
| 8614 | + firstDownload = false; | |
| 8615 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 8616 | + } else { | |
| 8617 | + this.href = link.href; | |
| 8618 | + } | |
| 8619 | + | |
| 8620 | + this.download = fn; | |
| 8621 | + | |
| 8622 | + } else { | |
| 8623 | + this.download = fn + ".html"; | |
| 8624 | + } | |
| 8625 | + } | |
| 8626 | + | |
| 8627 | + </script></div> | |
| 8628 | +<div class="table parbase section"> | |
| 8629 | + | |
| 8630 | + | |
| 8631 | + | |
| 8632 | + | |
| 8633 | + | |
| 8634 | + | |
| 8635 | + | |
| 8636 | +<div class="table-container"> | |
| 8637 | + <table class="bncr-table bncr-table-mobile" width="100%" cellspacing="0" cellpadding="1" border="1"> | |
| 8638 | + <tbody> | |
| 8639 | + <tr class="no-border"> | |
| 8640 | + <th style="text-align: center; width: 25%;" class="filled">Term</th> | |
| 8641 | + <th style="text-align: center; width: 25%;" class="filled">Open</th> | |
| 8642 | + <th style="text-align: center; width: 25%;" class="filled">Closed</th> | |
| 8643 | + <th style="text-align: center; width: 25%;" class="filled">APR<a href="#notes-item-30819b1e37" target="_self" class="link-not-underlined__darker" hrefnoextension="false"><sup style="left: 0;">8</sup>**</a></th> | |
| 8644 | + </tr> | |
| 8645 | + <tr class="no-border"> | |
| 8646 | + <td colspan="4" class="separator"><b>Prime = <span static-token='tauxBase|percent'>${p1.tauxBase|percent}</span></b></td> | |
| 8647 | + </tr> | |
| 8648 | + <tr> | |
| 8649 | + <td><p style="margin-left: 40px;">3 months</p></td> | |
| 8650 | + <td><p style="margin-left: 40px;">---</p></td> | |
| 8651 | + <td><p style="margin-left: 40px;"><span static-token='taux3moisF|percent:"true"'>${p1.taux3moisF|percent:"true"}</span><br></p></td> | |
| 8652 | + <td><p style="margin-left: 40px;">8.37%</p></td> | |
| 8653 | + </tr> | |
| 8654 | + <tr> | |
| 8655 | + <td><p style="margin-left: 40px;">6 months</p></td> | |
| 8656 | + <td><p style="margin-left: 40px;"><span static-token='taux6moisO|percent:"true"'>${p1.taux6moisO|percent:"true"}</span><br></p></td> | |
| 8657 | + <td><p style="margin-left: 40px;"><span static-token='taux6moisF|percent:"true"'>${p1.taux6moisF|percent:"true"}</span><br></p></td> | |
| 8658 | + <td><p style="margin-left: 40px;">Open: 9.98%<br> Closed: 6.31%</p></td> | |
| 8659 | + </tr> | |
| 8660 | + <tr> | |
| 8661 | + <td><p style="margin-left: 40px;">1 year</p></td> | |
| 8662 | + <td><p style="margin-left: 40px;"><span static-token='taux1anO|percent:"true"'>${p1.taux1anO|percent:"true"}</span><br></p></td> | |
| 8663 | + <td><p style="margin-left: 40px;"><span static-token='taux1anF|percent:"true"'>${p1.taux1anF|percent:"true"}</span><br></p></td> | |
| 8664 | + <td><p style="margin-left: 40px;">Open: 9.77%<br> Closed: 5.61%<br></p></td> | |
| 8665 | + </tr> | |
| 8666 | + <tr> | |
| 8667 | + <td><p style="margin-left: 40px;">2 years</p></td> | |
| 8668 | + <td><p style="margin-left: 40px;">---</p></td> | |
| 8669 | + <td><p style="margin-left: 40px;"><span static-token='taux2ansF|percent:"true"'>${p1.taux2ansF|percent:"true"}</span><br></p></td> | |
| 8670 | + <td><p style="margin-left: 40px;">5.31%<br></p></td> | |
| 8671 | + </tr> | |
| 8672 | + <tr> | |
| 8673 | + <td><p style="margin-left: 40px;">3 years</p></td> | |
| 8674 | + <td><p style="margin-left: 40px;">---</p></td> | |
| 8675 | + <td><p style="margin-left: 40px;"><span static-token='taux3ansF|percent:"true"'>${p1.taux3ansF|percent:"true"}</span><br></p></td> | |
| 8676 | + <td><p style="margin-left: 40px;">6.10%<br></p></td> | |
| 8677 | + </tr> | |
| 8678 | + <tr> | |
| 8679 | + <td><p style="margin-left: 40px;">4 years</p></td> | |
| 8680 | + <td><p style="margin-left: 40px;">---</p></td> | |
| 8681 | + <td><p style="margin-left: 40px;"><span static-token='taux4ansF|percent:"true"'>${p1.taux4ansF|percent:"true"}</span> <a href="#promo" target="_self">see the promo</a><br></p></td> | |
| 8682 | + <td><p style="margin-left: 40px;">6.03%<br></p></td> | |
| 8683 | + </tr> | |
| 8684 | + <tr> | |
| 8685 | + <td><p style="margin-left: 40px;">5 years</p></td> | |
| 8686 | + <td><p style="margin-left: 40px;">---</p></td> | |
| 8687 | + <td><p style="margin-left: 40px;"><span static-token='taux5ansF|percent:"true"'>${p1.taux5ansF|percent:"true"}</span> <a href="#promo" target="_self">see the promo</a><br></p></td> | |
| 8688 | + <td><p style="margin-left: 40px;">6.13%<br></p></td> | |
| 8689 | + </tr> | |
| 8690 | + </tbody> | |
| 8691 | +</table> | |
| 8692 | + | |
| 8693 | + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span> | |
| 8694 | + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span> | |
| 8695 | + <div class="table-carousel-dots"></div> | |
| 8696 | +</div> | |
| 8697 | + | |
| 8698 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer/parsys/table"> | |
| 8699 | + new Websites.TableStatic({ | |
| 8700 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer/parsys/table", | |
| 8701 | + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')), | |
| 8702 | + capsuleAlias: "c1", | |
| 8703 | + staticHeader: !!(""), // use !! to convert to boolean | |
| 8704 | + carousel: !!(""), | |
| 8705 | + transposition: !!(""), | |
| 8706 | + customId: "" | |
| 8707 | + }); | |
| 8708 | +</script> | |
| 8709 | +</div> | |
| 8710 | +<div class="accordion panelcontainer section"> | |
| 8711 | + | |
| 8712 | + | |
| 8713 | +<script src="/etc.clientlibs/core/wcm/components/commons/site/clientlibs/container.min.0a6aff292f5cc42142779cde92054524.js"></script> | |
| 8714 | +<script src="/etc.clientlibs/core/wcm/components/accordion/v1/accordion/clientlibs/site.min.c254b351182288a72fbd32db1f3a5320.js"></script> | |
| 8715 | + | |
| 8716 | + | |
| 8717 | + | |
| 8718 | + | |
| 8719 | + | |
| 8720 | +<link rel="stylesheet" href="/etc.clientlibs/core/wcm/components/accordion/v1/accordion/clientlibs/site.min.44a1783be8e88dc73188908af6c38c01.css" type="text/css"> | |
| 8721 | +<link rel="stylesheet" href="/etc.clientlibs/web-sites-toolkit/components/content/accordion/clientlibs/site.min.f6c1348a612942645a5181a642bcadb4.css" type="text/css"> | |
| 8722 | + | |
| 8723 | + | |
| 8724 | + | |
| 8725 | + | |
| 8726 | + | |
| 8727 | +<div id="accordion-d1c9554935" class="cmp-accordion" data-cmp-is="accordion" data-placeholder-text="false"> | |
| 8728 | + <div class="cmp-accordion__item" data-cmp-hook-accordion="item" id="accordion-d1c9554935-item-264a601db1"> | |
| 8729 | + <h3 class="cmp-accordion__header"> | |
| 8730 | + <button id="accordion-d1c9554935-item-264a601db1-button" class="cmp-accordion__button" aria-controls="accordion-d1c9554935-item-264a601db1-panel" data-cmp-hook-accordion="button"> | |
| 8731 | + <span class="cmp-accordion__title">See all fixed-rates</span> | |
| 8732 | + <span class="cmp-accordion__icon"></span> | |
| 8733 | + </button> | |
| 8734 | + </h3> | |
| 8735 | + <div data-cmp-hook-accordion="panel" id="accordion-d1c9554935-item-264a601db1-panel" class="cmp-accordion__panel cmp-accordion__panel--hidden" role="region" aria-labelledby="accordion-d1c9554935-item-264a601db1-button"><div class="container responsivegrid"> | |
| 8736 | + | |
| 8737 | + | |
| 8738 | +<link rel="stylesheet" href="/etc.clientlibs/web-sites-toolkit/components/content/container/clientlibs.min.90932f7188b6de3499a57fd9afe1ddb6.css" type="text/css"> | |
| 8739 | + | |
| 8740 | + | |
| 8741 | + | |
| 8742 | + | |
| 8743 | + | |
| 8744 | + | |
| 8745 | + | |
| 8746 | + | |
| 8747 | + <div id="container-264a601db1" class="cmp-container"> | |
| 8748 | + | |
| 8749 | + <div class="table parbase"> | |
| 8750 | + | |
| 8751 | + | |
| 8752 | + | |
| 8753 | + | |
| 8754 | + | |
| 8755 | + | |
| 8756 | + | |
| 8757 | +<div class="table-container"> | |
| 8758 | + <table class="bncr-table bncr-table-mobile" width="100%" cellspacing="0" cellpadding="1" border="1"> | |
| 8759 | + <tbody> | |
| 8760 | + <tr class="no-border"> | |
| 8761 | + <th style="text-align: center; width: 25%;" class="filled">Term</th> | |
| 8762 | + <th style="text-align: center; width: 25%;" class="filled">Open</th> | |
| 8763 | + <th style="text-align: center; width: 25%;" class="filled">Closed</th> | |
| 8764 | + <th style="text-align: center; width: 25%;" class="filled">APR<a href="#notes-item-30819b1e37" target="_self" class="link-not-underlined__darker" hrefnoextension="false"><sup style="left: 0;">8</sup>**</a></th> | |
| 8765 | + </tr> | |
| 8766 | + <tr> | |
| 8767 | + <td><p style="margin-left: 40px;">6 years</p></td> | |
| 8768 | + <td><p style="margin-left: 40px;">---</p></td> | |
| 8769 | + <td><p style="margin-left: 40px;"><span static-token='taux6ansF|percent:"true"'>${p1.taux6ansF|percent:"true"}</span><br></p></td> | |
| 8770 | + <td><p style="margin-left: 40px;">6.44%</p></td> | |
| 8771 | + </tr> | |
| 8772 | + <tr> | |
| 8773 | + <td><p style="margin-left: 40px;">7 years</p></td> | |
| 8774 | + <td><p style="margin-left: 40px;">---</p></td> | |
| 8775 | + <td><p style="margin-left: 40px;"><span static-token='taux7ansF|percent:"true"'>${p1.taux7ansF|percent:"true"}</span><br></p></td> | |
| 8776 | + <td><p style="margin-left: 40px;">6.43%</p></td> | |
| 8777 | + </tr> | |
| 8778 | + <tr> | |
| 8779 | + <td><p style="margin-left: 40px;">10 years</p></td> | |
| 8780 | + <td><p style="margin-left: 40px;">---</p></td> | |
| 8781 | + <td><p style="margin-left: 40px;"><span static-token='taux10ansF|percent:"true"'>${p1.taux10ansF|percent:"true"}</span><br></p></td> | |
| 8782 | + <td><p style="margin-left: 40px;">6.83%</p></td> | |
| 8783 | + </tr> | |
| 8784 | + </tbody> | |
| 8785 | +</table> | |
| 8786 | + | |
| 8787 | + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span> | |
| 8788 | + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span> | |
| 8789 | + <div class="table-carousel-dots"></div> | |
| 8790 | +</div> | |
| 8791 | + | |
| 8792 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer/parsys/accordion_1525997712/item_1330618322/table_copy_165091638"> | |
| 8793 | + new Websites.TableStatic({ | |
| 8794 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer/parsys/accordion_1525997712/item_1330618322/table_copy_165091638", | |
| 8795 | + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')), | |
| 8796 | + capsuleAlias: "c1", | |
| 8797 | + staticHeader: !!(""), // use !! to convert to boolean | |
| 8798 | + carousel: !!(""), | |
| 8799 | + transposition: !!(""), | |
| 8800 | + customId: "" | |
| 8801 | + }); | |
| 8802 | +</script> | |
| 8803 | +</div> | |
| 8804 | + | |
| 8805 | + | |
| 8806 | + </div> | |
| 8807 | + | |
| 8808 | +</div> | |
| 8809 | +</div> | |
| 8810 | + </div> | |
| 8811 | + | |
| 8812 | + | |
| 8813 | +</div> | |
| 8814 | +</div> | |
| 8815 | + | |
| 8816 | +</div> | |
| 8817 | + | |
| 8818 | +</div> | |
| 8819 | + | |
| 8820 | + | |
| 8821 | + | |
| 8822 | +<!--/* Initialize Js */--> | |
| 8823 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer"> | |
| 8824 | + if(""){ | |
| 8825 | + new Websites.Sticky({ | |
| 8826 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer", | |
| 8827 | + breakpoint: { | |
| 8828 | + lg: { | |
| 8829 | + to: "" | |
| 8830 | + }, | |
| 8831 | + md: { | |
| 8832 | + to: "" | |
| 8833 | + }, | |
| 8834 | + sm: { | |
| 8835 | + to: "none", | |
| 8836 | + }, | |
| 8837 | + xs: { | |
| 8838 | + to: "none" | |
| 8839 | + } | |
| 8840 | + } | |
| 8841 | + }); | |
| 8842 | + } | |
| 8843 | +</script> | |
| 8844 | + | |
| 8845 | +</div> | |
| 8846 | +</div> | |
| 8847 | +<div class="panelContainer section"> | |
| 8848 | + | |
| 8849 | + | |
| 8850 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 8851 | + | |
| 8852 | + | |
| 8853 | + | |
| 8854 | + <div> | |
| 8855 | + | |
| 8856 | + | |
| 8857 | + | |
| 8858 | + | |
| 8859 | + | |
| 8860 | + | |
| 8861 | + | |
| 8862 | + | |
| 8863 | + | |
| 8864 | + | |
| 8865 | + | |
| 8866 | + | |
| 8867 | + | |
| 8868 | + | |
| 8869 | + | |
| 8870 | + | |
| 8871 | + | |
| 8872 | + | |
| 8873 | + | |
| 8874 | + | |
| 8875 | + | |
| 8876 | + | |
| 8877 | + | |
| 8878 | +<div class="panelContainer " | |
| 8879 | + | |
| 8880 | + | |
| 8881 | + data-websites-component="/components/panelContainer.v1" | |
| 8882 | + data-panel-container-lg-mg="5% 0 0 0" | |
| 8883 | + data-panel-container-lg-pd="" | |
| 8884 | + data-panel-container-lg-ht="" | |
| 8885 | + data-panel-container-md-mg="5% 0 0 0" | |
| 8886 | + data-panel-container-md-pd="" | |
| 8887 | + data-panel-container-md-ht="" | |
| 8888 | + data-panel-container-sm-mg="5% 0 0 0" | |
| 8889 | + data-panel-container-sm-pd="" | |
| 8890 | + data-panel-container-sm-ht="" | |
| 8891 | + data-panel-container-xs-mg="5% 0 0 0" | |
| 8892 | + data-panel-container-xs-pd="" | |
| 8893 | + data-panel-container-xs-ht="" | |
| 8894 | + data-panel-container-limit=""> | |
| 8895 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 8896 | + | |
| 8897 | + | |
| 8898 | + | |
| 8899 | + | |
| 8900 | + | |
| 8901 | + | |
| 8902 | + | |
| 8903 | + | |
| 8904 | + | |
| 8905 | + | |
| 8906 | + | |
| 8907 | + | |
| 8908 | + | |
| 8909 | + | |
| 8910 | + | |
| 8911 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_textandimage" class="text-image-container " | |
| 8912 | + data-text-image-container-right-left="false"> | |
| 8913 | + | |
| 8914 | + | |
| 8915 | + | |
| 8916 | + | |
| 8917 | + | |
| 8918 | + | |
| 8919 | + | |
| 8920 | + | |
| 8921 | + | |
| 8922 | + <div class="row text-image-row" | |
| 8923 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 8924 | + | |
| 8925 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 8926 | + | |
| 8927 | + | |
| 8928 | + | |
| 8929 | + | |
| 8930 | + | |
| 8931 | + data-text-image-rowcontainer-height-lg="0" | |
| 8932 | + data-text-image-rowcontainer-width-lg="0" | |
| 8933 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 8934 | + | |
| 8935 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 8936 | + | |
| 8937 | + | |
| 8938 | + | |
| 8939 | + | |
| 8940 | + | |
| 8941 | + data-text-image-rowcontainer-height-md="0" | |
| 8942 | + data-text-image-rowcontainer-width-md="0" | |
| 8943 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 8944 | + | |
| 8945 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 8946 | + | |
| 8947 | + | |
| 8948 | + | |
| 8949 | + | |
| 8950 | + | |
| 8951 | + data-text-image-rowcontainer-height-sm="0" | |
| 8952 | + data-text-image-rowcontainer-width-sm="0" | |
| 8953 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 8954 | + | |
| 8955 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 8956 | + | |
| 8957 | + | |
| 8958 | + | |
| 8959 | + | |
| 8960 | + | |
| 8961 | + data-text-image-rowcontainer-height-xs="0" | |
| 8962 | + data-text-image-rowcontainer-width-xs="0" | |
| 8963 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 8964 | + | |
| 8965 | + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant1"><a id="variable-rate"></a>Variable-rate loan<br> | |
| 8966 | +</h2> | |
| 8967 | +</div> | |
| 8968 | + </div> | |
| 8969 | + | |
| 8970 | + | |
| 8971 | + | |
| 8972 | + | |
| 8973 | + | |
| 8974 | + | |
| 8975 | + | |
| 8976 | + | |
| 8977 | + | |
| 8978 | + | |
| 8979 | + | |
| 8980 | + <script> | |
| 8981 | + | |
| 8982 | + (function(){ | |
| 8983 | + | |
| 8984 | + var dataLayerViewEventName = '' || ''; | |
| 8985 | + var dataLayerViewLayerProperties = []; | |
| 8986 | + var $el; | |
| 8987 | + | |
| 8988 | + | |
| 8989 | + | |
| 8990 | + if(dataLayerViewEventName.trim().length) { | |
| 8991 | + | |
| 8992 | + var obj = { | |
| 8993 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 8994 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_textandimage" , | |
| 8995 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 8996 | + }; | |
| 8997 | + | |
| 8998 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 8999 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 9000 | + if(document.currentScript){ | |
| 9001 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9002 | + } else { | |
| 9003 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 9004 | + var currentScript = scripts[scripts.length - 1]; | |
| 9005 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9006 | + } | |
| 9007 | + | |
| 9008 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 9009 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 9010 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 9011 | + | |
| 9012 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 9013 | + | |
| 9014 | + } | |
| 9015 | + | |
| 9016 | + })(); | |
| 9017 | + | |
| 9018 | + </script> | |
| 9019 | + | |
| 9020 | +</div> | |
| 9021 | + | |
| 9022 | + <script> | |
| 9023 | + | |
| 9024 | + /** | |
| 9025 | + * clickEventDownloadHandler() | |
| 9026 | + * Is used to handle download image action selected as an opening mode | |
| 9027 | + * | |
| 9028 | + */ | |
| 9029 | + | |
| 9030 | + var firstDownload = true; | |
| 9031 | + | |
| 9032 | + function clickEventDownloadHandler() { | |
| 9033 | + | |
| 9034 | + var link = this; | |
| 9035 | + var filename = link.dataset.linkpath; | |
| 9036 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 9037 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 9038 | + | |
| 9039 | + if (newFile) { | |
| 9040 | + | |
| 9041 | + if (firstDownload) { | |
| 9042 | + firstDownload = false; | |
| 9043 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 9044 | + } else { | |
| 9045 | + this.href = link.href; | |
| 9046 | + } | |
| 9047 | + | |
| 9048 | + this.download = fn; | |
| 9049 | + | |
| 9050 | + } else { | |
| 9051 | + this.download = fn + ".html"; | |
| 9052 | + } | |
| 9053 | + } | |
| 9054 | + | |
| 9055 | + </script></div> | |
| 9056 | +<div class="panelContainer section"> | |
| 9057 | + | |
| 9058 | + | |
| 9059 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 9060 | + | |
| 9061 | + | |
| 9062 | + | |
| 9063 | + <div> | |
| 9064 | + | |
| 9065 | + | |
| 9066 | + | |
| 9067 | + | |
| 9068 | + | |
| 9069 | + | |
| 9070 | + | |
| 9071 | + | |
| 9072 | + | |
| 9073 | + | |
| 9074 | + | |
| 9075 | + | |
| 9076 | + | |
| 9077 | + | |
| 9078 | + | |
| 9079 | + | |
| 9080 | + | |
| 9081 | + | |
| 9082 | + | |
| 9083 | + | |
| 9084 | + | |
| 9085 | + | |
| 9086 | + | |
| 9087 | +<div class="panelContainer background-none " | |
| 9088 | + | |
| 9089 | + | |
| 9090 | + data-websites-component="/components/panelContainer.v1" | |
| 9091 | + data-panel-container-lg-mg="1% 20% 0 0" | |
| 9092 | + data-panel-container-lg-pd="" | |
| 9093 | + data-panel-container-lg-ht="" | |
| 9094 | + data-panel-container-md-mg="1% 20% 0 0" | |
| 9095 | + data-panel-container-md-pd="" | |
| 9096 | + data-panel-container-md-ht="" | |
| 9097 | + data-panel-container-sm-mg="1% 0 0 0" | |
| 9098 | + data-panel-container-sm-pd="" | |
| 9099 | + data-panel-container-sm-ht="" | |
| 9100 | + data-panel-container-xs-mg="1% 0 0 0" | |
| 9101 | + data-panel-container-xs-pd="" | |
| 9102 | + data-panel-container-xs-ht="" | |
| 9103 | + data-panel-container-limit=""> | |
| 9104 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 9105 | + | |
| 9106 | + | |
| 9107 | + | |
| 9108 | + | |
| 9109 | + | |
| 9110 | + | |
| 9111 | + | |
| 9112 | + | |
| 9113 | + | |
| 9114 | + | |
| 9115 | + | |
| 9116 | + | |
| 9117 | + | |
| 9118 | + | |
| 9119 | + | |
| 9120 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 9121 | + data-text-image-container-right-left="false"> | |
| 9122 | + | |
| 9123 | + | |
| 9124 | + | |
| 9125 | + | |
| 9126 | + | |
| 9127 | + | |
| 9128 | + | |
| 9129 | + | |
| 9130 | + | |
| 9131 | + <div class="row text-image-row" | |
| 9132 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 9133 | + | |
| 9134 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 9135 | + | |
| 9136 | + | |
| 9137 | + | |
| 9138 | + | |
| 9139 | + | |
| 9140 | + data-text-image-rowcontainer-height-lg="0" | |
| 9141 | + data-text-image-rowcontainer-width-lg="0" | |
| 9142 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 9143 | + | |
| 9144 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 9145 | + | |
| 9146 | + | |
| 9147 | + | |
| 9148 | + | |
| 9149 | + | |
| 9150 | + data-text-image-rowcontainer-height-md="0" | |
| 9151 | + data-text-image-rowcontainer-width-md="0" | |
| 9152 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 9153 | + | |
| 9154 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 9155 | + | |
| 9156 | + | |
| 9157 | + | |
| 9158 | + | |
| 9159 | + | |
| 9160 | + data-text-image-rowcontainer-height-sm="0" | |
| 9161 | + data-text-image-rowcontainer-width-sm="0" | |
| 9162 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 9163 | + | |
| 9164 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 9165 | + | |
| 9166 | + | |
| 9167 | + | |
| 9168 | + | |
| 9169 | + | |
| 9170 | + data-text-image-rowcontainer-height-xs="0" | |
| 9171 | + data-text-image-rowcontainer-width-xs="0" | |
| 9172 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 9173 | + | |
| 9174 | + <div class="col-xs-12 text-image-text-container | |
| 9175 | + initializing" ><p>Variable-rate <a href="/personal/mortgages/loan.html" target="_self" class="link-underlined__darker" hrefnoextension="false">mortgage loan </a>have an interest rate of Prime + <span static-token='ecart|percent:"true"'>${p2.ecart|percent:"true"}</span><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false"><sup>4</sup></a> and are adjusted monthly. They allow you to take advantage of lower interest rates.</p></div> | |
| 9176 | + </div> | |
| 9177 | + | |
| 9178 | + | |
| 9179 | + | |
| 9180 | + | |
| 9181 | + | |
| 9182 | + | |
| 9183 | + | |
| 9184 | + | |
| 9185 | + | |
| 9186 | + | |
| 9187 | + | |
| 9188 | + | |
| 9189 | + <script> | |
| 9190 | + (function(){ | |
| 9191 | + var $el; | |
| 9192 | + var listeners = []; | |
| 9193 | + var dataLayerViewEventName = ''; | |
| 9194 | + var dataLayerViewLayerProperties = []; | |
| 9195 | + | |
| 9196 | + dataLayerViewEventName = ''; | |
| 9197 | + | |
| 9198 | + | |
| 9199 | + | |
| 9200 | + | |
| 9201 | + | |
| 9202 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 9203 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 9204 | + if(document.currentScript){ | |
| 9205 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9206 | + } else { | |
| 9207 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 9208 | + var currentScript = scripts[scripts.length - 1]; | |
| 9209 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9210 | + } | |
| 9211 | + | |
| 9212 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 9213 | + Websites.Product.TextContent.initTextContent({ | |
| 9214 | + $el: $el, | |
| 9215 | + capsuleAlias: "c1", | |
| 9216 | + listeners: listeners, | |
| 9217 | + products: Websites.Product.Core.determineProductsArray("c1"), | |
| 9218 | + dataLayerViewEvent: { | |
| 9219 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 9220 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_panelcontainer_parsys_textandimage" , | |
| 9221 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 9222 | + } | |
| 9223 | + }); | |
| 9224 | + }); | |
| 9225 | + })(); | |
| 9226 | + | |
| 9227 | + </script> | |
| 9228 | + | |
| 9229 | + | |
| 9230 | + | |
| 9231 | + | |
| 9232 | + | |
| 9233 | +</div> | |
| 9234 | + | |
| 9235 | + <script> | |
| 9236 | + | |
| 9237 | + /** | |
| 9238 | + * clickEventDownloadHandler() | |
| 9239 | + * Is used to handle download image action selected as an opening mode | |
| 9240 | + * | |
| 9241 | + */ | |
| 9242 | + | |
| 9243 | + var firstDownload = true; | |
| 9244 | + | |
| 9245 | + function clickEventDownloadHandler() { | |
| 9246 | + | |
| 9247 | + var link = this; | |
| 9248 | + var filename = link.dataset.linkpath; | |
| 9249 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 9250 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 9251 | + | |
| 9252 | + if (newFile) { | |
| 9253 | + | |
| 9254 | + if (firstDownload) { | |
| 9255 | + firstDownload = false; | |
| 9256 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 9257 | + } else { | |
| 9258 | + this.href = link.href; | |
| 9259 | + } | |
| 9260 | + | |
| 9261 | + this.download = fn; | |
| 9262 | + | |
| 9263 | + } else { | |
| 9264 | + this.download = fn + ".html"; | |
| 9265 | + } | |
| 9266 | + } | |
| 9267 | + | |
| 9268 | + </script></div> | |
| 9269 | + | |
| 9270 | +</div> | |
| 9271 | + | |
| 9272 | +</div> | |
| 9273 | + | |
| 9274 | + | |
| 9275 | + | |
| 9276 | +<!--/* Initialize Js */--> | |
| 9277 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630/parsys/panelcontainer"> | |
| 9278 | + if(""){ | |
| 9279 | + new Websites.Sticky({ | |
| 9280 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630/parsys/panelcontainer", | |
| 9281 | + breakpoint: { | |
| 9282 | + lg: { | |
| 9283 | + to: "" | |
| 9284 | + }, | |
| 9285 | + md: { | |
| 9286 | + to: "" | |
| 9287 | + }, | |
| 9288 | + sm: { | |
| 9289 | + to: "", | |
| 9290 | + }, | |
| 9291 | + xs: { | |
| 9292 | + to: "" | |
| 9293 | + } | |
| 9294 | + } | |
| 9295 | + }); | |
| 9296 | + } | |
| 9297 | +</script> | |
| 9298 | + | |
| 9299 | +</div> | |
| 9300 | +</div> | |
| 9301 | +<div class="textandimage parbase section"> | |
| 9302 | + | |
| 9303 | + | |
| 9304 | + | |
| 9305 | + | |
| 9306 | + | |
| 9307 | + | |
| 9308 | + | |
| 9309 | + | |
| 9310 | + | |
| 9311 | + | |
| 9312 | + | |
| 9313 | + | |
| 9314 | + | |
| 9315 | + | |
| 9316 | + | |
| 9317 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_textandimage_2116172872" class="text-image-container " | |
| 9318 | + data-text-image-container-right-left="false"> | |
| 9319 | + | |
| 9320 | + | |
| 9321 | + | |
| 9322 | + | |
| 9323 | + | |
| 9324 | + | |
| 9325 | + | |
| 9326 | + | |
| 9327 | + | |
| 9328 | + <div class="row text-image-row" | |
| 9329 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 9330 | + | |
| 9331 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 9332 | + | |
| 9333 | + | |
| 9334 | + | |
| 9335 | + | |
| 9336 | + | |
| 9337 | + data-text-image-rowcontainer-height-lg="0" | |
| 9338 | + data-text-image-rowcontainer-width-lg="0" | |
| 9339 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 9340 | + | |
| 9341 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 9342 | + | |
| 9343 | + | |
| 9344 | + | |
| 9345 | + | |
| 9346 | + | |
| 9347 | + data-text-image-rowcontainer-height-md="0" | |
| 9348 | + data-text-image-rowcontainer-width-md="0" | |
| 9349 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 9350 | + | |
| 9351 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 9352 | + | |
| 9353 | + | |
| 9354 | + | |
| 9355 | + | |
| 9356 | + | |
| 9357 | + data-text-image-rowcontainer-height-sm="0" | |
| 9358 | + data-text-image-rowcontainer-width-sm="0" | |
| 9359 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 9360 | + | |
| 9361 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 9362 | + | |
| 9363 | + | |
| 9364 | + | |
| 9365 | + | |
| 9366 | + | |
| 9367 | + data-text-image-rowcontainer-height-xs="0" | |
| 9368 | + data-text-image-rowcontainer-width-xs="0" | |
| 9369 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 9370 | + | |
| 9371 | + <div class="col-xs-12 text-image-text-container | |
| 9372 | + initializing" ><p class="pvariant3"><b><br> | |
| 9373 | + Rate (%) as at <span static-token='tauxDateJour|date:"-"'>${p2.tauxDateJour|date:"-"}</span></b></p></div> | |
| 9374 | + </div> | |
| 9375 | + | |
| 9376 | + | |
| 9377 | + | |
| 9378 | + | |
| 9379 | + | |
| 9380 | + | |
| 9381 | + | |
| 9382 | + | |
| 9383 | + | |
| 9384 | + | |
| 9385 | + | |
| 9386 | + | |
| 9387 | + <script> | |
| 9388 | + (function(){ | |
| 9389 | + var $el; | |
| 9390 | + var listeners = []; | |
| 9391 | + var dataLayerViewEventName = ''; | |
| 9392 | + var dataLayerViewLayerProperties = []; | |
| 9393 | + | |
| 9394 | + dataLayerViewEventName = ''; | |
| 9395 | + | |
| 9396 | + | |
| 9397 | + | |
| 9398 | + | |
| 9399 | + | |
| 9400 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 9401 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 9402 | + if(document.currentScript){ | |
| 9403 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9404 | + } else { | |
| 9405 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 9406 | + var currentScript = scripts[scripts.length - 1]; | |
| 9407 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9408 | + } | |
| 9409 | + | |
| 9410 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 9411 | + Websites.Product.TextContent.initTextContent({ | |
| 9412 | + $el: $el, | |
| 9413 | + capsuleAlias: "c1", | |
| 9414 | + listeners: listeners, | |
| 9415 | + products: Websites.Product.Core.determineProductsArray("c1"), | |
| 9416 | + dataLayerViewEvent: { | |
| 9417 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 9418 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_726300686_parsys_panelcontainer_16630_parsys_textandimage_2116172872" , | |
| 9419 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 9420 | + } | |
| 9421 | + }); | |
| 9422 | + }); | |
| 9423 | + })(); | |
| 9424 | + | |
| 9425 | + </script> | |
| 9426 | + | |
| 9427 | + | |
| 9428 | + | |
| 9429 | + | |
| 9430 | + | |
| 9431 | +</div> | |
| 9432 | + | |
| 9433 | + <script> | |
| 9434 | + | |
| 9435 | + /** | |
| 9436 | + * clickEventDownloadHandler() | |
| 9437 | + * Is used to handle download image action selected as an opening mode | |
| 9438 | + * | |
| 9439 | + */ | |
| 9440 | + | |
| 9441 | + var firstDownload = true; | |
| 9442 | + | |
| 9443 | + function clickEventDownloadHandler() { | |
| 9444 | + | |
| 9445 | + var link = this; | |
| 9446 | + var filename = link.dataset.linkpath; | |
| 9447 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 9448 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 9449 | + | |
| 9450 | + if (newFile) { | |
| 9451 | + | |
| 9452 | + if (firstDownload) { | |
| 9453 | + firstDownload = false; | |
| 9454 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 9455 | + } else { | |
| 9456 | + this.href = link.href; | |
| 9457 | + } | |
| 9458 | + | |
| 9459 | + this.download = fn; | |
| 9460 | + | |
| 9461 | + } else { | |
| 9462 | + this.download = fn + ".html"; | |
| 9463 | + } | |
| 9464 | + } | |
| 9465 | + | |
| 9466 | + </script></div> | |
| 9467 | +<div class="table parbase section"> | |
| 9468 | + | |
| 9469 | + | |
| 9470 | + | |
| 9471 | + | |
| 9472 | + | |
| 9473 | + | |
| 9474 | + | |
| 9475 | +<div class="table-container"> | |
| 9476 | + <table class="bncr-table bncr-table-mobile" width="100%" cellspacing="0" cellpadding="1" border="1"> | |
| 9477 | + <tbody> | |
| 9478 | + <tr class="no-border"> | |
| 9479 | + <th style="text-align: center;" class="filled">Mortgage</th> | |
| 9480 | + <th style="text-align: center;" class="filled">Reference rate</th> | |
| 9481 | + <th style="text-align: center;" class="filled">Difference</th> | |
| 9482 | + <th style="text-align: center;" class="filled">Rate in effect<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">*</a></th> | |
| 9483 | + <th style="text-align: center;" class="filled">APR<a href="#notes-item-30819b1e37" target="_self" class="link-not-underlined__darker" hrefnoextension="false"><sup style="left: 0;">8</sup>**</a></th> | |
| 9484 | + </tr> | |
| 9485 | + <tr class="no-border"> | |
| 9486 | + <td colspan="5" class="separator"><b>Prime = <span static-token='tauxBase|percent'>${p1.tauxBase|percent}</span></b></td> | |
| 9487 | + </tr> | |
| 9488 | + <tr> | |
| 9489 | + <td>Variable-rate mortgage (60 month term)</td> | |
| 9490 | + <td><p style="margin-left: 40px;">Prime rate<br></p></td> | |
| 9491 | + <td><p style="margin-left: 40px;"><span static-token='ecart|percent:"true"'>${p2.ecart|percent:"true"}</span><br></p></td> | |
| 9492 | + <td><p style="margin-left: 40px;"><span static-token='taux5ansO|percent:"true"'>${p2.taux5ansO|percent:"true"}</span><br></p></td> | |
| 9493 | + <td><p style="margin-left: 40px;">4.74%</p></td> | |
| 9494 | + </tr> | |
| 9495 | + <tr> | |
| 9496 | + <td><a href="/personal/help-centre.html#mortgage" target="_self" hrefnoextension="false">Capped-rate mortgage</a> (60 month term)</td> | |
| 9497 | + <td><p style="margin-left: 40px;">Prime rate</p> <p style="margin-left: 40px;">Capped rate<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false"><sup>5</sup></a> = <span static-token='tauxPlafond|percent:"true"'>${p3.tauxPlafond|percent:"true"}</span><br></p></td> | |
| 9498 | + <td><p style="margin-left: 40px;"><span static-token='ecart|percent:"true"'>${p3.ecart|percent:"true"}</span><br></p></td> | |
| 9499 | + <td><p style="margin-left: 40px;"><span static-token='taux5ansO|percent:"true"'>${p3.taux5ansO|percent:"true"}</span><br></p></td> | |
| 9500 | + <td><p style="margin-left: 40px;">5.24%</p></td> | |
| 9501 | + </tr> | |
| 9502 | + </tbody> | |
| 9503 | +</table> | |
| 9504 | + | |
| 9505 | + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span> | |
| 9506 | + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span> | |
| 9507 | + <div class="table-carousel-dots"></div> | |
| 9508 | +</div> | |
| 9509 | + | |
| 9510 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630/parsys/table"> | |
| 9511 | + new Websites.TableStatic({ | |
| 9512 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630/parsys/table", | |
| 9513 | + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')), | |
| 9514 | + capsuleAlias: "c1", | |
| 9515 | + staticHeader: !!(""), // use !! to convert to boolean | |
| 9516 | + carousel: !!(""), | |
| 9517 | + transposition: !!(""), | |
| 9518 | + customId: "" | |
| 9519 | + }); | |
| 9520 | +</script> | |
| 9521 | +</div> | |
| 9522 | + | |
| 9523 | +</div> | |
| 9524 | + | |
| 9525 | +</div> | |
| 9526 | + | |
| 9527 | + | |
| 9528 | + | |
| 9529 | +<!--/* Initialize Js */--> | |
| 9530 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630"> | |
| 9531 | + if(""){ | |
| 9532 | + new Websites.Sticky({ | |
| 9533 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686/parsys/panelcontainer_16630", | |
| 9534 | + breakpoint: { | |
| 9535 | + lg: { | |
| 9536 | + to: "" | |
| 9537 | + }, | |
| 9538 | + md: { | |
| 9539 | + to: "" | |
| 9540 | + }, | |
| 9541 | + sm: { | |
| 9542 | + to: "", | |
| 9543 | + }, | |
| 9544 | + xs: { | |
| 9545 | + to: "" | |
| 9546 | + } | |
| 9547 | + } | |
| 9548 | + }); | |
| 9549 | + } | |
| 9550 | +</script> | |
| 9551 | + | |
| 9552 | +</div> | |
| 9553 | +</div> | |
| 9554 | + | |
| 9555 | +</div> | |
| 9556 | + | |
| 9557 | +</div> | |
| 9558 | + | |
| 9559 | + | |
| 9560 | + | |
| 9561 | +<!--/* Initialize Js */--> | |
| 9562 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686"> | |
| 9563 | + if(""){ | |
| 9564 | + new Websites.Sticky({ | |
| 9565 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_726300686", | |
| 9566 | + breakpoint: { | |
| 9567 | + lg: { | |
| 9568 | + to: "none" | |
| 9569 | + }, | |
| 9570 | + md: { | |
| 9571 | + to: "none" | |
| 9572 | + }, | |
| 9573 | + sm: { | |
| 9574 | + to: "none", | |
| 9575 | + }, | |
| 9576 | + xs: { | |
| 9577 | + to: "none" | |
| 9578 | + } | |
| 9579 | + } | |
| 9580 | + }); | |
| 9581 | + } | |
| 9582 | +</script> | |
| 9583 | + | |
| 9584 | +</div> | |
| 9585 | +</div> | |
| 9586 | +<div class="panelContainer section"> | |
| 9587 | + | |
| 9588 | + | |
| 9589 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 9590 | + | |
| 9591 | + | |
| 9592 | + | |
| 9593 | + <div> | |
| 9594 | + | |
| 9595 | + | |
| 9596 | + | |
| 9597 | + | |
| 9598 | + | |
| 9599 | + | |
| 9600 | + | |
| 9601 | + | |
| 9602 | + | |
| 9603 | + | |
| 9604 | + | |
| 9605 | + | |
| 9606 | + | |
| 9607 | + | |
| 9608 | + | |
| 9609 | + | |
| 9610 | + | |
| 9611 | + | |
| 9612 | + | |
| 9613 | + | |
| 9614 | + | |
| 9615 | + | |
| 9616 | + | |
| 9617 | +<div class="panelContainer panelContainerStyle2 " | |
| 9618 | + | |
| 9619 | + | |
| 9620 | + data-websites-component="/components/panelContainer.v1" | |
| 9621 | + data-panel-container-lg-mg="" | |
| 9622 | + data-panel-container-lg-pd="" | |
| 9623 | + data-panel-container-lg-ht="" | |
| 9624 | + data-panel-container-md-mg="" | |
| 9625 | + data-panel-container-md-pd="" | |
| 9626 | + data-panel-container-md-ht="" | |
| 9627 | + data-panel-container-sm-mg="" | |
| 9628 | + data-panel-container-sm-pd="" | |
| 9629 | + data-panel-container-sm-ht="" | |
| 9630 | + data-panel-container-xs-mg="" | |
| 9631 | + data-panel-container-xs-pd="" | |
| 9632 | + data-panel-container-xs-ht="" | |
| 9633 | + data-panel-container-limit=""> | |
| 9634 | + <div class="parsys"><div class="panelContainer section"> | |
| 9635 | + | |
| 9636 | + | |
| 9637 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 9638 | + | |
| 9639 | + | |
| 9640 | + | |
| 9641 | + <div> | |
| 9642 | + | |
| 9643 | + | |
| 9644 | + | |
| 9645 | + | |
| 9646 | + | |
| 9647 | + | |
| 9648 | + | |
| 9649 | + | |
| 9650 | + | |
| 9651 | + | |
| 9652 | + | |
| 9653 | + | |
| 9654 | + | |
| 9655 | + | |
| 9656 | + | |
| 9657 | + | |
| 9658 | + | |
| 9659 | + | |
| 9660 | + | |
| 9661 | + | |
| 9662 | + | |
| 9663 | + | |
| 9664 | + | |
| 9665 | +<div class="panelContainer " | |
| 9666 | + | |
| 9667 | + | |
| 9668 | + data-websites-component="/components/panelContainer.v1" | |
| 9669 | + data-panel-container-lg-mg="2% 0 0 0" | |
| 9670 | + data-panel-container-lg-pd="" | |
| 9671 | + data-panel-container-lg-ht="" | |
| 9672 | + data-panel-container-md-mg="2% 0 0 0" | |
| 9673 | + data-panel-container-md-pd="" | |
| 9674 | + data-panel-container-md-ht="" | |
| 9675 | + data-panel-container-sm-mg="2% 0 0 0" | |
| 9676 | + data-panel-container-sm-pd="" | |
| 9677 | + data-panel-container-sm-ht="" | |
| 9678 | + data-panel-container-xs-mg="2% 0 0 0" | |
| 9679 | + data-panel-container-xs-pd="" | |
| 9680 | + data-panel-container-xs-ht="" | |
| 9681 | + data-panel-container-limit=""> | |
| 9682 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 9683 | + | |
| 9684 | + | |
| 9685 | + | |
| 9686 | + | |
| 9687 | + | |
| 9688 | + | |
| 9689 | + | |
| 9690 | + | |
| 9691 | + | |
| 9692 | + | |
| 9693 | + | |
| 9694 | + | |
| 9695 | + | |
| 9696 | + | |
| 9697 | + | |
| 9698 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_70689_parsys_textandimage" class="text-image-container " | |
| 9699 | + data-text-image-container-right-left="false"> | |
| 9700 | + | |
| 9701 | + | |
| 9702 | + | |
| 9703 | + | |
| 9704 | + | |
| 9705 | + | |
| 9706 | + | |
| 9707 | + | |
| 9708 | + | |
| 9709 | + <div class="row text-image-row" | |
| 9710 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 9711 | + | |
| 9712 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 9713 | + | |
| 9714 | + | |
| 9715 | + | |
| 9716 | + | |
| 9717 | + | |
| 9718 | + data-text-image-rowcontainer-height-lg="0" | |
| 9719 | + data-text-image-rowcontainer-width-lg="0" | |
| 9720 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 9721 | + | |
| 9722 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 9723 | + | |
| 9724 | + | |
| 9725 | + | |
| 9726 | + | |
| 9727 | + | |
| 9728 | + data-text-image-rowcontainer-height-md="0" | |
| 9729 | + data-text-image-rowcontainer-width-md="0" | |
| 9730 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 9731 | + | |
| 9732 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 9733 | + | |
| 9734 | + | |
| 9735 | + | |
| 9736 | + | |
| 9737 | + | |
| 9738 | + data-text-image-rowcontainer-height-sm="0" | |
| 9739 | + data-text-image-rowcontainer-width-sm="0" | |
| 9740 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 9741 | + | |
| 9742 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 9743 | + | |
| 9744 | + | |
| 9745 | + | |
| 9746 | + | |
| 9747 | + | |
| 9748 | + data-text-image-rowcontainer-height-xs="0" | |
| 9749 | + data-text-image-rowcontainer-width-xs="0" | |
| 9750 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 9751 | + | |
| 9752 | + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant1"><a id="credit"></a>Home equity line of credit<br> | |
| 9753 | +</h2> | |
| 9754 | +</div> | |
| 9755 | + </div> | |
| 9756 | + | |
| 9757 | + | |
| 9758 | + | |
| 9759 | + | |
| 9760 | + | |
| 9761 | + | |
| 9762 | + | |
| 9763 | + | |
| 9764 | + | |
| 9765 | + | |
| 9766 | + | |
| 9767 | + <script> | |
| 9768 | + | |
| 9769 | + (function(){ | |
| 9770 | + | |
| 9771 | + var dataLayerViewEventName = '' || ''; | |
| 9772 | + var dataLayerViewLayerProperties = []; | |
| 9773 | + var $el; | |
| 9774 | + | |
| 9775 | + | |
| 9776 | + | |
| 9777 | + if(dataLayerViewEventName.trim().length) { | |
| 9778 | + | |
| 9779 | + var obj = { | |
| 9780 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 9781 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_70689_parsys_textandimage" , | |
| 9782 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 9783 | + }; | |
| 9784 | + | |
| 9785 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 9786 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 9787 | + if(document.currentScript){ | |
| 9788 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9789 | + } else { | |
| 9790 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 9791 | + var currentScript = scripts[scripts.length - 1]; | |
| 9792 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9793 | + } | |
| 9794 | + | |
| 9795 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 9796 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 9797 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 9798 | + | |
| 9799 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 9800 | + | |
| 9801 | + } | |
| 9802 | + | |
| 9803 | + })(); | |
| 9804 | + | |
| 9805 | + </script> | |
| 9806 | + | |
| 9807 | +</div> | |
| 9808 | + | |
| 9809 | + <script> | |
| 9810 | + | |
| 9811 | + /** | |
| 9812 | + * clickEventDownloadHandler() | |
| 9813 | + * Is used to handle download image action selected as an opening mode | |
| 9814 | + * | |
| 9815 | + */ | |
| 9816 | + | |
| 9817 | + var firstDownload = true; | |
| 9818 | + | |
| 9819 | + function clickEventDownloadHandler() { | |
| 9820 | + | |
| 9821 | + var link = this; | |
| 9822 | + var filename = link.dataset.linkpath; | |
| 9823 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 9824 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 9825 | + | |
| 9826 | + if (newFile) { | |
| 9827 | + | |
| 9828 | + if (firstDownload) { | |
| 9829 | + firstDownload = false; | |
| 9830 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 9831 | + } else { | |
| 9832 | + this.href = link.href; | |
| 9833 | + } | |
| 9834 | + | |
| 9835 | + this.download = fn; | |
| 9836 | + | |
| 9837 | + } else { | |
| 9838 | + this.download = fn + ".html"; | |
| 9839 | + } | |
| 9840 | + } | |
| 9841 | + | |
| 9842 | + </script></div> | |
| 9843 | +<div class="panelContainer section"> | |
| 9844 | + | |
| 9845 | + | |
| 9846 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 9847 | + | |
| 9848 | + | |
| 9849 | + | |
| 9850 | + <div> | |
| 9851 | + | |
| 9852 | + | |
| 9853 | + | |
| 9854 | + | |
| 9855 | + | |
| 9856 | + | |
| 9857 | + | |
| 9858 | + | |
| 9859 | + | |
| 9860 | + | |
| 9861 | + | |
| 9862 | + | |
| 9863 | + | |
| 9864 | + | |
| 9865 | + | |
| 9866 | + | |
| 9867 | + | |
| 9868 | + | |
| 9869 | + | |
| 9870 | + | |
| 9871 | + | |
| 9872 | + | |
| 9873 | + | |
| 9874 | +<div class="panelContainer background-none " | |
| 9875 | + | |
| 9876 | + | |
| 9877 | + data-websites-component="/components/panelContainer.v1" | |
| 9878 | + data-panel-container-lg-mg="1% 20% 0 0" | |
| 9879 | + data-panel-container-lg-pd="" | |
| 9880 | + data-panel-container-lg-ht="" | |
| 9881 | + data-panel-container-md-mg="1% 20% 0 0" | |
| 9882 | + data-panel-container-md-pd="" | |
| 9883 | + data-panel-container-md-ht="" | |
| 9884 | + data-panel-container-sm-mg="1% 0 0 0" | |
| 9885 | + data-panel-container-sm-pd="" | |
| 9886 | + data-panel-container-sm-ht="" | |
| 9887 | + data-panel-container-xs-mg="1% 0 0 0" | |
| 9888 | + data-panel-container-xs-pd="" | |
| 9889 | + data-panel-container-xs-ht="" | |
| 9890 | + data-panel-container-limit=""> | |
| 9891 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 9892 | + | |
| 9893 | + | |
| 9894 | + | |
| 9895 | + | |
| 9896 | + | |
| 9897 | + | |
| 9898 | + | |
| 9899 | + | |
| 9900 | + | |
| 9901 | + | |
| 9902 | + | |
| 9903 | + | |
| 9904 | + | |
| 9905 | + | |
| 9906 | + | |
| 9907 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_70689_parsys_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 9908 | + data-text-image-container-right-left="false"> | |
| 9909 | + | |
| 9910 | + | |
| 9911 | + | |
| 9912 | + | |
| 9913 | + | |
| 9914 | + | |
| 9915 | + | |
| 9916 | + | |
| 9917 | + | |
| 9918 | + <div class="row text-image-row" | |
| 9919 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 9920 | + | |
| 9921 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 9922 | + | |
| 9923 | + | |
| 9924 | + | |
| 9925 | + | |
| 9926 | + | |
| 9927 | + data-text-image-rowcontainer-height-lg="0" | |
| 9928 | + data-text-image-rowcontainer-width-lg="0" | |
| 9929 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 9930 | + | |
| 9931 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 9932 | + | |
| 9933 | + | |
| 9934 | + | |
| 9935 | + | |
| 9936 | + | |
| 9937 | + data-text-image-rowcontainer-height-md="0" | |
| 9938 | + data-text-image-rowcontainer-width-md="0" | |
| 9939 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 9940 | + | |
| 9941 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 9942 | + | |
| 9943 | + | |
| 9944 | + | |
| 9945 | + | |
| 9946 | + | |
| 9947 | + data-text-image-rowcontainer-height-sm="0" | |
| 9948 | + data-text-image-rowcontainer-width-sm="0" | |
| 9949 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 9950 | + | |
| 9951 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 9952 | + | |
| 9953 | + | |
| 9954 | + | |
| 9955 | + | |
| 9956 | + | |
| 9957 | + data-text-image-rowcontainer-height-xs="0" | |
| 9958 | + data-text-image-rowcontainer-width-xs="0" | |
| 9959 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 9960 | + | |
| 9961 | + <div class="col-xs-12 text-image-text-container " ><p>The All-In-One<sup><a hrefnoextension="false" href="#notes-item-30819b1e37" target="_self">TM</a></sup> <a href="/personal/mortgages/all-in-one.html" target="_self" class="link-underlined__darker" hrefnoextension="false">home equity line of credit</a> allows you to use the principal you repay to finance new projects, like renovations or travel. The rate is variable.<br> | |
| 9962 | +</p> | |
| 9963 | +</div> | |
| 9964 | + </div> | |
| 9965 | + | |
| 9966 | + | |
| 9967 | + | |
| 9968 | + | |
| 9969 | + | |
| 9970 | + | |
| 9971 | + | |
| 9972 | + | |
| 9973 | + | |
| 9974 | + | |
| 9975 | + | |
| 9976 | + <script> | |
| 9977 | + | |
| 9978 | + (function(){ | |
| 9979 | + | |
| 9980 | + var dataLayerViewEventName = '' || ''; | |
| 9981 | + var dataLayerViewLayerProperties = []; | |
| 9982 | + var $el; | |
| 9983 | + | |
| 9984 | + | |
| 9985 | + | |
| 9986 | + if(dataLayerViewEventName.trim().length) { | |
| 9987 | + | |
| 9988 | + var obj = { | |
| 9989 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 9990 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_70689_parsys_panelcontainer_parsys_textandimage" , | |
| 9991 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 9992 | + }; | |
| 9993 | + | |
| 9994 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 9995 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 9996 | + if(document.currentScript){ | |
| 9997 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 9998 | + } else { | |
| 9999 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 10000 | + var currentScript = scripts[scripts.length - 1]; | |
| 10001 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 10002 | + } | |
| 10003 | + | |
| 10004 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 10005 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 10006 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 10007 | + | |
| 10008 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 10009 | + | |
| 10010 | + } | |
| 10011 | + | |
| 10012 | + })(); | |
| 10013 | + | |
| 10014 | + </script> | |
| 10015 | + | |
| 10016 | +</div> | |
| 10017 | + | |
| 10018 | + <script> | |
| 10019 | + | |
| 10020 | + /** | |
| 10021 | + * clickEventDownloadHandler() | |
| 10022 | + * Is used to handle download image action selected as an opening mode | |
| 10023 | + * | |
| 10024 | + */ | |
| 10025 | + | |
| 10026 | + var firstDownload = true; | |
| 10027 | + | |
| 10028 | + function clickEventDownloadHandler() { | |
| 10029 | + | |
| 10030 | + var link = this; | |
| 10031 | + var filename = link.dataset.linkpath; | |
| 10032 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 10033 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 10034 | + | |
| 10035 | + if (newFile) { | |
| 10036 | + | |
| 10037 | + if (firstDownload) { | |
| 10038 | + firstDownload = false; | |
| 10039 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 10040 | + } else { | |
| 10041 | + this.href = link.href; | |
| 10042 | + } | |
| 10043 | + | |
| 10044 | + this.download = fn; | |
| 10045 | + | |
| 10046 | + } else { | |
| 10047 | + this.download = fn + ".html"; | |
| 10048 | + } | |
| 10049 | + } | |
| 10050 | + | |
| 10051 | + </script></div> | |
| 10052 | + | |
| 10053 | +</div> | |
| 10054 | + | |
| 10055 | +</div> | |
| 10056 | + | |
| 10057 | + | |
| 10058 | + | |
| 10059 | +<!--/* Initialize Js */--> | |
| 10060 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_70689/parsys/panelcontainer"> | |
| 10061 | + if(""){ | |
| 10062 | + new Websites.Sticky({ | |
| 10063 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_70689/parsys/panelcontainer", | |
| 10064 | + breakpoint: { | |
| 10065 | + lg: { | |
| 10066 | + to: "" | |
| 10067 | + }, | |
| 10068 | + md: { | |
| 10069 | + to: "" | |
| 10070 | + }, | |
| 10071 | + sm: { | |
| 10072 | + to: "", | |
| 10073 | + }, | |
| 10074 | + xs: { | |
| 10075 | + to: "" | |
| 10076 | + } | |
| 10077 | + } | |
| 10078 | + }); | |
| 10079 | + } | |
| 10080 | +</script> | |
| 10081 | + | |
| 10082 | +</div> | |
| 10083 | +</div> | |
| 10084 | + | |
| 10085 | +</div> | |
| 10086 | + | |
| 10087 | +</div> | |
| 10088 | + | |
| 10089 | + | |
| 10090 | + | |
| 10091 | +<!--/* Initialize Js */--> | |
| 10092 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_70689"> | |
| 10093 | + if(""){ | |
| 10094 | + new Websites.Sticky({ | |
| 10095 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_70689", | |
| 10096 | + breakpoint: { | |
| 10097 | + lg: { | |
| 10098 | + to: "none" | |
| 10099 | + }, | |
| 10100 | + md: { | |
| 10101 | + to: "none" | |
| 10102 | + }, | |
| 10103 | + sm: { | |
| 10104 | + to: "none", | |
| 10105 | + }, | |
| 10106 | + xs: { | |
| 10107 | + to: "none" | |
| 10108 | + } | |
| 10109 | + } | |
| 10110 | + }); | |
| 10111 | + } | |
| 10112 | +</script> | |
| 10113 | + | |
| 10114 | +</div> | |
| 10115 | +</div> | |
| 10116 | +<div class="textandimage parbase section"> | |
| 10117 | + | |
| 10118 | + | |
| 10119 | + | |
| 10120 | + | |
| 10121 | + | |
| 10122 | + | |
| 10123 | + | |
| 10124 | + | |
| 10125 | + | |
| 10126 | + | |
| 10127 | + | |
| 10128 | + | |
| 10129 | + | |
| 10130 | + | |
| 10131 | + | |
| 10132 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_textandimage_2116172" class="text-image-container " | |
| 10133 | + data-text-image-container-right-left="false"> | |
| 10134 | + | |
| 10135 | + | |
| 10136 | + | |
| 10137 | + | |
| 10138 | + | |
| 10139 | + | |
| 10140 | + | |
| 10141 | + | |
| 10142 | + | |
| 10143 | + <div class="row text-image-row" | |
| 10144 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 10145 | + | |
| 10146 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 10147 | + | |
| 10148 | + | |
| 10149 | + | |
| 10150 | + | |
| 10151 | + | |
| 10152 | + data-text-image-rowcontainer-height-lg="0" | |
| 10153 | + data-text-image-rowcontainer-width-lg="0" | |
| 10154 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 10155 | + | |
| 10156 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 10157 | + | |
| 10158 | + | |
| 10159 | + | |
| 10160 | + | |
| 10161 | + | |
| 10162 | + data-text-image-rowcontainer-height-md="0" | |
| 10163 | + data-text-image-rowcontainer-width-md="0" | |
| 10164 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 10165 | + | |
| 10166 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 10167 | + | |
| 10168 | + | |
| 10169 | + | |
| 10170 | + | |
| 10171 | + | |
| 10172 | + data-text-image-rowcontainer-height-sm="0" | |
| 10173 | + data-text-image-rowcontainer-width-sm="0" | |
| 10174 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 10175 | + | |
| 10176 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 10177 | + | |
| 10178 | + | |
| 10179 | + | |
| 10180 | + | |
| 10181 | + | |
| 10182 | + data-text-image-rowcontainer-height-xs="0" | |
| 10183 | + data-text-image-rowcontainer-width-xs="0" | |
| 10184 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 10185 | + | |
| 10186 | + <div class="col-xs-12 text-image-text-container | |
| 10187 | + initializing" ><p class="pvariant3"><b><br> | |
| 10188 | + Rate (%) as at <span static-token='tauxDateJour|date:"-"'>${p2.tauxDateJour|date:"-"}</span><br> | |
| 10189 | + </b></p></div> | |
| 10190 | + </div> | |
| 10191 | + | |
| 10192 | + | |
| 10193 | + | |
| 10194 | + | |
| 10195 | + | |
| 10196 | + | |
| 10197 | + | |
| 10198 | + | |
| 10199 | + | |
| 10200 | + | |
| 10201 | + | |
| 10202 | + | |
| 10203 | + <script> | |
| 10204 | + (function(){ | |
| 10205 | + var $el; | |
| 10206 | + var listeners = []; | |
| 10207 | + var dataLayerViewEventName = ''; | |
| 10208 | + var dataLayerViewLayerProperties = []; | |
| 10209 | + | |
| 10210 | + dataLayerViewEventName = ''; | |
| 10211 | + | |
| 10212 | + | |
| 10213 | + | |
| 10214 | + | |
| 10215 | + | |
| 10216 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 10217 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 10218 | + if(document.currentScript){ | |
| 10219 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 10220 | + } else { | |
| 10221 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 10222 | + var currentScript = scripts[scripts.length - 1]; | |
| 10223 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 10224 | + } | |
| 10225 | + | |
| 10226 | + Websites.Product.Core.initContentQueue.push(function () { | |
| 10227 | + Websites.Product.TextContent.initTextContent({ | |
| 10228 | + $el: $el, | |
| 10229 | + capsuleAlias: "c1", | |
| 10230 | + listeners: listeners, | |
| 10231 | + products: Websites.Product.Core.determineProductsArray("c1"), | |
| 10232 | + dataLayerViewEvent: { | |
| 10233 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 10234 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_textandimage_2116172" , | |
| 10235 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 10236 | + } | |
| 10237 | + }); | |
| 10238 | + }); | |
| 10239 | + })(); | |
| 10240 | + | |
| 10241 | + </script> | |
| 10242 | + | |
| 10243 | + | |
| 10244 | + | |
| 10245 | + | |
| 10246 | + | |
| 10247 | +</div> | |
| 10248 | + | |
| 10249 | + <script> | |
| 10250 | + | |
| 10251 | + /** | |
| 10252 | + * clickEventDownloadHandler() | |
| 10253 | + * Is used to handle download image action selected as an opening mode | |
| 10254 | + * | |
| 10255 | + */ | |
| 10256 | + | |
| 10257 | + var firstDownload = true; | |
| 10258 | + | |
| 10259 | + function clickEventDownloadHandler() { | |
| 10260 | + | |
| 10261 | + var link = this; | |
| 10262 | + var filename = link.dataset.linkpath; | |
| 10263 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 10264 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 10265 | + | |
| 10266 | + if (newFile) { | |
| 10267 | + | |
| 10268 | + if (firstDownload) { | |
| 10269 | + firstDownload = false; | |
| 10270 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 10271 | + } else { | |
| 10272 | + this.href = link.href; | |
| 10273 | + } | |
| 10274 | + | |
| 10275 | + this.download = fn; | |
| 10276 | + | |
| 10277 | + } else { | |
| 10278 | + this.download = fn + ".html"; | |
| 10279 | + } | |
| 10280 | + } | |
| 10281 | + | |
| 10282 | + </script></div> | |
| 10283 | +<div class="table parbase section"> | |
| 10284 | + | |
| 10285 | + | |
| 10286 | + | |
| 10287 | + | |
| 10288 | + | |
| 10289 | + | |
| 10290 | + | |
| 10291 | +<div class="table-container"> | |
| 10292 | + <table width="100%" cellspacing="0" cellpadding="1" border="1" class="bncr-table bncr-table-mobile"> | |
| 10293 | + <tbody> | |
| 10294 | + <tr class="no-border"> | |
| 10295 | + <th class="filled"> </th> | |
| 10296 | + <th style="text-align: center;" class="filled">Prime rate<br></th> | |
| 10297 | + <th style="text-align: center;" class="filled">Difference</th> | |
| 10298 | + <th style="text-align: center;" class="filled">Rate in effect<a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false">*</a></th> | |
| 10299 | + <th style="text-align: center;" class="filled">Interest earned</th> | |
| 10300 | + </tr> | |
| 10301 | + <tr> | |
| 10302 | + <td><p>Rate for the home equity line of credit<br></p></td> | |
| 10303 | + <td><p style="text-align: center;"><span static-token='tauxBase|percent:"true"'>${p5.tauxBase|percent:"true"}</span><br></p></td> | |
| 10304 | + <td><p style="text-align: center;">1%<br></p></td> | |
| 10305 | + <td><p style="text-align: center;"><span static-token='taux|percent:"true"'>${p5.taux|percent:"true"}</span><br></p></td> | |
| 10306 | + <td style="text-align: center;"><p style="text-align: center;"><span static-token='interetCredT2|percent:"true"'>${p5.interetCredT2|percent:"true"}</span><sup> </sup><a href="#notes-item-30819b1e37" target="_self" hrefnoextension="false"><sup>6</sup></a></p></td> | |
| 10307 | + </tr> | |
| 10308 | + <tr> | |
| 10309 | + <td colspan="5"><p>Fixed rate of 7$ per month, per account</p></td> | |
| 10310 | + </tr> | |
| 10311 | + </tbody> | |
| 10312 | +</table> | |
| 10313 | + | |
| 10314 | + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span> | |
| 10315 | + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span> | |
| 10316 | + <div class="table-carousel-dots"></div> | |
| 10317 | +</div> | |
| 10318 | + | |
| 10319 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/table_copy_copy"> | |
| 10320 | + new Websites.TableStatic({ | |
| 10321 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/table_copy_copy", | |
| 10322 | + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')), | |
| 10323 | + capsuleAlias: "c2", | |
| 10324 | + staticHeader: !!(""), // use !! to convert to boolean | |
| 10325 | + carousel: !!(""), | |
| 10326 | + transposition: !!(""), | |
| 10327 | + customId: "" | |
| 10328 | + }); | |
| 10329 | +</script> | |
| 10330 | +</div> | |
| 10331 | +<div class="textandimage parbase section"> | |
| 10332 | + | |
| 10333 | + | |
| 10334 | + | |
| 10335 | + | |
| 10336 | + | |
| 10337 | + | |
| 10338 | + | |
| 10339 | + | |
| 10340 | + | |
| 10341 | + | |
| 10342 | + | |
| 10343 | + | |
| 10344 | + | |
| 10345 | + | |
| 10346 | + | |
| 10347 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_textandimage" class="text-image-container " | |
| 10348 | + data-text-image-container-right-left="false"> | |
| 10349 | + | |
| 10350 | + | |
| 10351 | + | |
| 10352 | + | |
| 10353 | + | |
| 10354 | + | |
| 10355 | + | |
| 10356 | + | |
| 10357 | + | |
| 10358 | + <div class="row text-image-row" | |
| 10359 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 10360 | + | |
| 10361 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 10362 | + | |
| 10363 | + | |
| 10364 | + | |
| 10365 | + | |
| 10366 | + | |
| 10367 | + data-text-image-rowcontainer-height-lg="0" | |
| 10368 | + data-text-image-rowcontainer-width-lg="0" | |
| 10369 | + data-text-image-rowcontainer-class-lg="" | |
| 10370 | + | |
| 10371 | + data-text-image-rowcontainer-bg-type-md="" | |
| 10372 | + | |
| 10373 | + | |
| 10374 | + | |
| 10375 | + | |
| 10376 | + | |
| 10377 | + data-text-image-rowcontainer-height-md="0" | |
| 10378 | + data-text-image-rowcontainer-width-md="0" | |
| 10379 | + data-text-image-rowcontainer-class-md="" | |
| 10380 | + | |
| 10381 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 10382 | + | |
| 10383 | + | |
| 10384 | + | |
| 10385 | + | |
| 10386 | + | |
| 10387 | + data-text-image-rowcontainer-height-sm="0" | |
| 10388 | + data-text-image-rowcontainer-width-sm="0" | |
| 10389 | + data-text-image-rowcontainer-class-sm="" | |
| 10390 | + | |
| 10391 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 10392 | + | |
| 10393 | + | |
| 10394 | + | |
| 10395 | + | |
| 10396 | + | |
| 10397 | + data-text-image-rowcontainer-height-xs="0" | |
| 10398 | + data-text-image-rowcontainer-width-xs="0" | |
| 10399 | + data-text-image-rowcontainer-class-xs=""> | |
| 10400 | + | |
| 10401 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/all-in-one.html" target="_self" class="btnRTE4 btn-arrow btn" hrefnoextension="false">See the line of credit</a></p> | |
| 10402 | +</div> | |
| 10403 | + </div> | |
| 10404 | + | |
| 10405 | + | |
| 10406 | + | |
| 10407 | + | |
| 10408 | + | |
| 10409 | + | |
| 10410 | + | |
| 10411 | + | |
| 10412 | + | |
| 10413 | + | |
| 10414 | + | |
| 10415 | + <script> | |
| 10416 | + | |
| 10417 | + (function(){ | |
| 10418 | + | |
| 10419 | + var dataLayerViewEventName = '' || ''; | |
| 10420 | + var dataLayerViewLayerProperties = []; | |
| 10421 | + var $el; | |
| 10422 | + | |
| 10423 | + | |
| 10424 | + | |
| 10425 | + if(dataLayerViewEventName.trim().length) { | |
| 10426 | + | |
| 10427 | + var obj = { | |
| 10428 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 10429 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_textandimage" , | |
| 10430 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 10431 | + }; | |
| 10432 | + | |
| 10433 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 10434 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 10435 | + if(document.currentScript){ | |
| 10436 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 10437 | + } else { | |
| 10438 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 10439 | + var currentScript = scripts[scripts.length - 1]; | |
| 10440 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 10441 | + } | |
| 10442 | + | |
| 10443 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 10444 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 10445 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 10446 | + | |
| 10447 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 10448 | + | |
| 10449 | + } | |
| 10450 | + | |
| 10451 | + })(); | |
| 10452 | + | |
| 10453 | + </script> | |
| 10454 | + | |
| 10455 | +</div> | |
| 10456 | + | |
| 10457 | + <script> | |
| 10458 | + | |
| 10459 | + /** | |
| 10460 | + * clickEventDownloadHandler() | |
| 10461 | + * Is used to handle download image action selected as an opening mode | |
| 10462 | + * | |
| 10463 | + */ | |
| 10464 | + | |
| 10465 | + var firstDownload = true; | |
| 10466 | + | |
| 10467 | + function clickEventDownloadHandler() { | |
| 10468 | + | |
| 10469 | + var link = this; | |
| 10470 | + var filename = link.dataset.linkpath; | |
| 10471 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 10472 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 10473 | + | |
| 10474 | + if (newFile) { | |
| 10475 | + | |
| 10476 | + if (firstDownload) { | |
| 10477 | + firstDownload = false; | |
| 10478 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 10479 | + } else { | |
| 10480 | + this.href = link.href; | |
| 10481 | + } | |
| 10482 | + | |
| 10483 | + this.download = fn; | |
| 10484 | + | |
| 10485 | + } else { | |
| 10486 | + this.download = fn + ".html"; | |
| 10487 | + } | |
| 10488 | + } | |
| 10489 | + | |
| 10490 | + </script></div> | |
| 10491 | +<div class="panelContainer section"> | |
| 10492 | + | |
| 10493 | + | |
| 10494 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 10495 | + | |
| 10496 | + | |
| 10497 | + | |
| 10498 | + <div> | |
| 10499 | + | |
| 10500 | + | |
| 10501 | + | |
| 10502 | + | |
| 10503 | + | |
| 10504 | + | |
| 10505 | + | |
| 10506 | + | |
| 10507 | + | |
| 10508 | + | |
| 10509 | + | |
| 10510 | + | |
| 10511 | + | |
| 10512 | + | |
| 10513 | + | |
| 10514 | + | |
| 10515 | + | |
| 10516 | + | |
| 10517 | + | |
| 10518 | + | |
| 10519 | + | |
| 10520 | + | |
| 10521 | + | |
| 10522 | +<div class="panelContainer hidden-lg hidden-md hidden-sm hidden-xs " | |
| 10523 | + | |
| 10524 | + | |
| 10525 | + data-websites-component="/components/panelContainer.v1" | |
| 10526 | + data-panel-container-lg-mg="" | |
| 10527 | + data-panel-container-lg-pd="" | |
| 10528 | + data-panel-container-lg-ht="" | |
| 10529 | + data-panel-container-md-mg="" | |
| 10530 | + data-panel-container-md-pd="" | |
| 10531 | + data-panel-container-md-ht="" | |
| 10532 | + data-panel-container-sm-mg="" | |
| 10533 | + data-panel-container-sm-pd="" | |
| 10534 | + data-panel-container-sm-ht="" | |
| 10535 | + data-panel-container-xs-mg="" | |
| 10536 | + data-panel-container-xs-pd="" | |
| 10537 | + data-panel-container-xs-ht="" | |
| 10538 | + data-panel-container-limit=""> | |
| 10539 | + <div class="parsys"><div class="table parbase section"> | |
| 10540 | + | |
| 10541 | + | |
| 10542 | + | |
| 10543 | + | |
| 10544 | + | |
| 10545 | + | |
| 10546 | + | |
| 10547 | +<div class="table-container"> | |
| 10548 | + <table width="100%" cellspacing="0" cellpadding="1" border="1" class="bncr-table bncr-table-mobile"> | |
| 10549 | + <tbody> | |
| 10550 | + <tr class="no-border"> | |
| 10551 | + <th style="text-align: center;" class="filled" colspan="2"><span style="font-size: 14px; font-weight: 400; letter-spacing: normal;">Interest earned (interest paid on accounts grouped together in the AIO)<br> </span></th> | |
| 10552 | + </tr> | |
| 10553 | + <tr class="no-border"> | |
| 10554 | + <td colspan="2" class="separator"><p style="margin-left: 40px;">Prime = <span static-token='tauxBase|percent:"true"'>${p5.tauxBase|percent:"true"}</span><br> All-in-one = Prime + <span static-token='ecart|percent:"true"'>${p5.ecart|percent:"true"}</span> = <span static-token='taux|percent:"true"'>${p5.taux|percent:"true"}</span><br> $6.00/month for the main account</p></td> | |
| 10555 | + </tr> | |
| 10556 | + <tr> | |
| 10557 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$0 to $4,999.99<br> </span></p></td> | |
| 10558 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT1|percent:"true"'>${p5.interetCredT1|percent:"true"}</span><br> </span></p></td> | |
| 10559 | + </tr> | |
| 10560 | + <tr> | |
| 10561 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$5,000 to $24,999.99<br> </span></p></td> | |
| 10562 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT2|percent:"true"'>${p5.interetCredT2|percent:"true"}</span><br> </span></p></td> | |
| 10563 | + </tr> | |
| 10564 | + <tr> | |
| 10565 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$25,000 to $59,999.99<br> </span></p></td> | |
| 10566 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT3|percent:"true"'>${p5.interetCredT3|percent:"true"}</span><br> </span></p></td> | |
| 10567 | + </tr> | |
| 10568 | + <tr> | |
| 10569 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$60,000 to $99,999.99<br> </span></p></td> | |
| 10570 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT4|percent:"true"'>${p5.interetCredT4|percent:"true"}</span><br> </span></p></td> | |
| 10571 | + </tr> | |
| 10572 | + <tr> | |
| 10573 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;">$100,000 or more<br> </span></p></td> | |
| 10574 | + <td><p style="margin-left: 40px;"><span style="font-size: 14px; letter-spacing: normal;"><span static-token='interetCredT5|percent:"true"'>${p5.interetCredT5|percent:"true"}</span><br> </span></p></td> | |
| 10575 | + </tr> | |
| 10576 | + </tbody> | |
| 10577 | +</table> | |
| 10578 | + | |
| 10579 | + <span class="table-carousel-arrow arrow-left"><i class="fa fa-angle-left"></i></span> | |
| 10580 | + <span class="table-carousel-arrow arrow-right"><i class="fa fa-angle-right"></i></span> | |
| 10581 | + <div class="table-carousel-dots"></div> | |
| 10582 | +</div> | |
| 10583 | + | |
| 10584 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer/parsys/table"> | |
| 10585 | + new Websites.TableStatic({ | |
| 10586 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer/parsys/table", | |
| 10587 | + listeners: JSON.parse("[]".replace(new RegExp('\\["', 'g'), '[').replace(new RegExp('\\"]', 'g'), ']').replace(new RegExp('\\\\', 'g'), '')), | |
| 10588 | + capsuleAlias: "c2", | |
| 10589 | + staticHeader: !!(""), // use !! to convert to boolean | |
| 10590 | + carousel: !!(""), | |
| 10591 | + transposition: !!(""), | |
| 10592 | + customId: "" | |
| 10593 | + }); | |
| 10594 | +</script> | |
| 10595 | +</div> | |
| 10596 | + | |
| 10597 | +</div> | |
| 10598 | + | |
| 10599 | +</div> | |
| 10600 | + | |
| 10601 | + | |
| 10602 | + | |
| 10603 | +<!--/* Initialize Js */--> | |
| 10604 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer"> | |
| 10605 | + if(""){ | |
| 10606 | + new Websites.Sticky({ | |
| 10607 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer", | |
| 10608 | + breakpoint: { | |
| 10609 | + lg: { | |
| 10610 | + to: "none" | |
| 10611 | + }, | |
| 10612 | + md: { | |
| 10613 | + to: "none" | |
| 10614 | + }, | |
| 10615 | + sm: { | |
| 10616 | + to: "none", | |
| 10617 | + }, | |
| 10618 | + xs: { | |
| 10619 | + to: "none" | |
| 10620 | + } | |
| 10621 | + } | |
| 10622 | + }); | |
| 10623 | + } | |
| 10624 | +</script> | |
| 10625 | + | |
| 10626 | +</div> | |
| 10627 | +</div> | |
| 10628 | +<div class="panelContainer section"> | |
| 10629 | + | |
| 10630 | + | |
| 10631 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 10632 | + | |
| 10633 | + | |
| 10634 | + | |
| 10635 | + <div> | |
| 10636 | + | |
| 10637 | + | |
| 10638 | + | |
| 10639 | + | |
| 10640 | + | |
| 10641 | + | |
| 10642 | + | |
| 10643 | + | |
| 10644 | + | |
| 10645 | + | |
| 10646 | + | |
| 10647 | + | |
| 10648 | + | |
| 10649 | + | |
| 10650 | + | |
| 10651 | + | |
| 10652 | + | |
| 10653 | + | |
| 10654 | + | |
| 10655 | + | |
| 10656 | + | |
| 10657 | + | |
| 10658 | + | |
| 10659 | +<div class="panelContainer at-0165-remove" | |
| 10660 | + | |
| 10661 | + | |
| 10662 | + data-websites-component="/components/panelContainer.v1" | |
| 10663 | + data-panel-container-lg-mg="5% 0% 0% 0%" | |
| 10664 | + data-panel-container-lg-pd="" | |
| 10665 | + data-panel-container-lg-ht="" | |
| 10666 | + data-panel-container-md-mg="5% 0% 0% 0%" | |
| 10667 | + data-panel-container-md-pd="" | |
| 10668 | + data-panel-container-md-ht="" | |
| 10669 | + data-panel-container-sm-mg="5% 0% 0% 0%" | |
| 10670 | + data-panel-container-sm-pd="" | |
| 10671 | + data-panel-container-sm-ht="" | |
| 10672 | + data-panel-container-xs-mg="5% 0% 0% 0%" | |
| 10673 | + data-panel-container-xs-pd="" | |
| 10674 | + data-panel-container-xs-ht="" | |
| 10675 | + data-panel-container-limit=""> | |
| 10676 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 10677 | + | |
| 10678 | + | |
| 10679 | + | |
| 10680 | + | |
| 10681 | + | |
| 10682 | + | |
| 10683 | + | |
| 10684 | + | |
| 10685 | + | |
| 10686 | + | |
| 10687 | + | |
| 10688 | + | |
| 10689 | + | |
| 10690 | + | |
| 10691 | + | |
| 10692 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_textandimage" class="text-image-container " | |
| 10693 | + data-text-image-container-right-left="false"> | |
| 10694 | + | |
| 10695 | + | |
| 10696 | + | |
| 10697 | + | |
| 10698 | + | |
| 10699 | + | |
| 10700 | + | |
| 10701 | + | |
| 10702 | + | |
| 10703 | + <div class="row text-image-row" | |
| 10704 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 10705 | + | |
| 10706 | + data-text-image-rowcontainer-bg-type-lg="none" | |
| 10707 | + | |
| 10708 | + | |
| 10709 | + | |
| 10710 | + | |
| 10711 | + | |
| 10712 | + data-text-image-rowcontainer-height-lg="0" | |
| 10713 | + data-text-image-rowcontainer-width-lg="0" | |
| 10714 | + data-text-image-rowcontainer-class-lg="backgroundColor1" | |
| 10715 | + | |
| 10716 | + data-text-image-rowcontainer-bg-type-md="none" | |
| 10717 | + | |
| 10718 | + | |
| 10719 | + | |
| 10720 | + | |
| 10721 | + | |
| 10722 | + data-text-image-rowcontainer-height-md="0" | |
| 10723 | + data-text-image-rowcontainer-width-md="0" | |
| 10724 | + data-text-image-rowcontainer-class-md="backgroundColor1" | |
| 10725 | + | |
| 10726 | + data-text-image-rowcontainer-bg-type-sm="none" | |
| 10727 | + | |
| 10728 | + | |
| 10729 | + | |
| 10730 | + | |
| 10731 | + | |
| 10732 | + data-text-image-rowcontainer-height-sm="0" | |
| 10733 | + data-text-image-rowcontainer-width-sm="0" | |
| 10734 | + data-text-image-rowcontainer-class-sm="backgroundColor1" | |
| 10735 | + | |
| 10736 | + data-text-image-rowcontainer-bg-type-xs="none" | |
| 10737 | + | |
| 10738 | + | |
| 10739 | + | |
| 10740 | + | |
| 10741 | + | |
| 10742 | + data-text-image-rowcontainer-height-xs="0" | |
| 10743 | + data-text-image-rowcontainer-width-xs="0" | |
| 10744 | + data-text-image-rowcontainer-class-xs="backgroundColor1"> | |
| 10745 | + | |
| 10746 | + <div class="col-xs-12 text-image-text-container " ><h2 class="h2variant3">Explore our mortgage solutions<br> | |
| 10747 | +</h2> | |
| 10748 | +</div> | |
| 10749 | + </div> | |
| 10750 | + | |
| 10751 | + | |
| 10752 | + | |
| 10753 | + | |
| 10754 | + | |
| 10755 | + | |
| 10756 | + | |
| 10757 | + | |
| 10758 | + | |
| 10759 | + | |
| 10760 | + | |
| 10761 | + <script> | |
| 10762 | + | |
| 10763 | + (function(){ | |
| 10764 | + | |
| 10765 | + var dataLayerViewEventName = '' || ''; | |
| 10766 | + var dataLayerViewLayerProperties = []; | |
| 10767 | + var $el; | |
| 10768 | + | |
| 10769 | + | |
| 10770 | + | |
| 10771 | + if(dataLayerViewEventName.trim().length) { | |
| 10772 | + | |
| 10773 | + var obj = { | |
| 10774 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 10775 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_textandimage" , | |
| 10776 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 10777 | + }; | |
| 10778 | + | |
| 10779 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 10780 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 10781 | + if(document.currentScript){ | |
| 10782 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 10783 | + } else { | |
| 10784 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 10785 | + var currentScript = scripts[scripts.length - 1]; | |
| 10786 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 10787 | + } | |
| 10788 | + | |
| 10789 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 10790 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 10791 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 10792 | + | |
| 10793 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 10794 | + | |
| 10795 | + } | |
| 10796 | + | |
| 10797 | + })(); | |
| 10798 | + | |
| 10799 | + </script> | |
| 10800 | + | |
| 10801 | +</div> | |
| 10802 | + | |
| 10803 | + <script> | |
| 10804 | + | |
| 10805 | + /** | |
| 10806 | + * clickEventDownloadHandler() | |
| 10807 | + * Is used to handle download image action selected as an opening mode | |
| 10808 | + * | |
| 10809 | + */ | |
| 10810 | + | |
| 10811 | + var firstDownload = true; | |
| 10812 | + | |
| 10813 | + function clickEventDownloadHandler() { | |
| 10814 | + | |
| 10815 | + var link = this; | |
| 10816 | + var filename = link.dataset.linkpath; | |
| 10817 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 10818 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 10819 | + | |
| 10820 | + if (newFile) { | |
| 10821 | + | |
| 10822 | + if (firstDownload) { | |
| 10823 | + firstDownload = false; | |
| 10824 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 10825 | + } else { | |
| 10826 | + this.href = link.href; | |
| 10827 | + } | |
| 10828 | + | |
| 10829 | + this.download = fn; | |
| 10830 | + | |
| 10831 | + } else { | |
| 10832 | + this.download = fn + ".html"; | |
| 10833 | + } | |
| 10834 | + } | |
| 10835 | + | |
| 10836 | + </script></div> | |
| 10837 | +<div class="panelContainer section"> | |
| 10838 | + | |
| 10839 | + | |
| 10840 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 10841 | + | |
| 10842 | + | |
| 10843 | + | |
| 10844 | + <div> | |
| 10845 | + | |
| 10846 | + | |
| 10847 | + | |
| 10848 | + | |
| 10849 | + | |
| 10850 | + | |
| 10851 | + | |
| 10852 | + | |
| 10853 | + | |
| 10854 | + | |
| 10855 | + | |
| 10856 | + | |
| 10857 | + | |
| 10858 | + | |
| 10859 | + | |
| 10860 | + | |
| 10861 | + | |
| 10862 | + | |
| 10863 | + | |
| 10864 | + | |
| 10865 | + | |
| 10866 | + | |
| 10867 | + | |
| 10868 | +<div class="panelContainer panel-border panel-border-radius " | |
| 10869 | + | |
| 10870 | + | |
| 10871 | + data-websites-component="/components/panelContainer.v1" | |
| 10872 | + data-panel-container-lg-mg="" | |
| 10873 | + data-panel-container-lg-pd="" | |
| 10874 | + data-panel-container-lg-ht="" | |
| 10875 | + data-panel-container-md-mg="" | |
| 10876 | + data-panel-container-md-pd="" | |
| 10877 | + data-panel-container-md-ht="" | |
| 10878 | + data-panel-container-sm-mg="" | |
| 10879 | + data-panel-container-sm-pd="" | |
| 10880 | + data-panel-container-sm-ht="" | |
| 10881 | + data-panel-container-xs-mg="" | |
| 10882 | + data-panel-container-xs-pd="" | |
| 10883 | + data-panel-container-xs-ht="" | |
| 10884 | + data-panel-container-limit=""> | |
| 10885 | + <div class="parsys"><div class="columns parbase section"> | |
| 10886 | + | |
| 10887 | + | |
| 10888 | + | |
| 10889 | + | |
| 10890 | +<div data-emptytext="Responsive Columns" class="cq-placeholder"></div> | |
| 10891 | + | |
| 10892 | + | |
| 10893 | + | |
| 10894 | + | |
| 10895 | + | |
| 10896 | + | |
| 10897 | + | |
| 10898 | + | |
| 10899 | + | |
| 10900 | + | |
| 10901 | + | |
| 10902 | + | |
| 10903 | + | |
| 10904 | + <div style="" | |
| 10905 | + class="columns-row row adapt-size row-eq-height" | |
| 10906 | + | |
| 10907 | + data-style-lg="" data-height-lg="" | |
| 10908 | + data-width-lg="" | |
| 10909 | + data-background-color-lg="" | |
| 10910 | + data-background-color-xs=""> | |
| 10911 | + <div style="" | |
| 10912 | + class="col-xs-12 col-sm-12 columns-title " | |
| 10913 | + data-height="" data-width="" | |
| 10914 | + data-style-xs="" data-height-xs="" | |
| 10915 | + data-width-xs=""> | |
| 10916 | + | |
| 10917 | + </div> | |
| 10918 | + | |
| 10919 | + | |
| 10920 | + | |
| 10921 | + | |
| 10922 | + <div class="col-xs-12 col-sm-4 column col-first separatorFilet"> | |
| 10923 | + <div class="parsys1 parsys"><div class="panelContainer section"> | |
| 10924 | + | |
| 10925 | + | |
| 10926 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 10927 | + | |
| 10928 | + | |
| 10929 | + | |
| 10930 | + <div> | |
| 10931 | + | |
| 10932 | + | |
| 10933 | + | |
| 10934 | + | |
| 10935 | + | |
| 10936 | + | |
| 10937 | + | |
| 10938 | + | |
| 10939 | + | |
| 10940 | + | |
| 10941 | + | |
| 10942 | + | |
| 10943 | + | |
| 10944 | + | |
| 10945 | + | |
| 10946 | + | |
| 10947 | + | |
| 10948 | + | |
| 10949 | + | |
| 10950 | + | |
| 10951 | + | |
| 10952 | + | |
| 10953 | + | |
| 10954 | +<div class="panelContainer " | |
| 10955 | + | |
| 10956 | + | |
| 10957 | + data-websites-component="/components/panelContainer.v1" | |
| 10958 | + data-panel-container-lg-mg="" | |
| 10959 | + data-panel-container-lg-pd="30px 20px 20px 20px" | |
| 10960 | + data-panel-container-lg-ht="" | |
| 10961 | + data-panel-container-md-mg="" | |
| 10962 | + data-panel-container-md-pd="30px 20px 20px 20px" | |
| 10963 | + data-panel-container-md-ht="" | |
| 10964 | + data-panel-container-sm-mg="" | |
| 10965 | + data-panel-container-sm-pd="30px 20px 20px 20px" | |
| 10966 | + data-panel-container-sm-ht="" | |
| 10967 | + data-panel-container-xs-mg="" | |
| 10968 | + data-panel-container-xs-pd="30px 20px 20px 20px" | |
| 10969 | + data-panel-container-xs-ht="" | |
| 10970 | + data-panel-container-limit=""> | |
| 10971 | + <div class="parsys"><div class="plainhtmlcode section"> | |
| 10972 | +<div data-emptytext="HTML Component" class="cq-placeholder"></div> | |
| 10973 | +<style>.bnc-promo-pastille { | |
| 10974 | + position: absolute; | |
| 10975 | + top: -35px; | |
| 10976 | + right: 15px; | |
| 10977 | +}</style> | |
| 10978 | + | |
| 10979 | +<p style="position:relative; margin: 0;"><span style="font-size: 14.0px; letter-spacing: normal;"><img src="/etc.clientlibs/web-sites/components/product/clientlibs/core/site/resources/images/bnc-promo.png" alt="promo" class="bnc-promo-pastille"></span></p> | |
| 10980 | +</div> | |
| 10981 | +<div class="textandimage parbase section"> | |
| 10982 | + | |
| 10983 | + | |
| 10984 | + | |
| 10985 | + | |
| 10986 | + | |
| 10987 | + | |
| 10988 | + | |
| 10989 | + | |
| 10990 | + | |
| 10991 | + | |
| 10992 | + | |
| 10993 | + | |
| 10994 | + | |
| 10995 | + | |
| 10996 | + | |
| 10997 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_panelcontainer_parsys_columns_parsys1_panelcontainer_parsys_textandimage" class="text-image-container " | |
| 10998 | + data-text-image-container-right-left="false"> | |
| 10999 | + | |
| 11000 | + | |
| 11001 | + | |
| 11002 | + | |
| 11003 | + | |
| 11004 | + | |
| 11005 | + | |
| 11006 | + | |
| 11007 | + | |
| 11008 | + <div class="row text-image-row" | |
| 11009 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 11010 | + | |
| 11011 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 11012 | + | |
| 11013 | + | |
| 11014 | + | |
| 11015 | + | |
| 11016 | + | |
| 11017 | + data-text-image-rowcontainer-height-lg="0" | |
| 11018 | + data-text-image-rowcontainer-width-lg="0" | |
| 11019 | + data-text-image-rowcontainer-class-lg="" | |
| 11020 | + | |
| 11021 | + data-text-image-rowcontainer-bg-type-md="" | |
| 11022 | + | |
| 11023 | + | |
| 11024 | + | |
| 11025 | + | |
| 11026 | + | |
| 11027 | + data-text-image-rowcontainer-height-md="0" | |
| 11028 | + data-text-image-rowcontainer-width-md="0" | |
| 11029 | + data-text-image-rowcontainer-class-md="" | |
| 11030 | + | |
| 11031 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 11032 | + | |
| 11033 | + | |
| 11034 | + | |
| 11035 | + | |
| 11036 | + | |
| 11037 | + data-text-image-rowcontainer-height-sm="0" | |
| 11038 | + data-text-image-rowcontainer-width-sm="0" | |
| 11039 | + data-text-image-rowcontainer-class-sm="" | |
| 11040 | + | |
| 11041 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 11042 | + | |
| 11043 | + | |
| 11044 | + | |
| 11045 | + | |
| 11046 | + | |
| 11047 | + data-text-image-rowcontainer-height-xs="0" | |
| 11048 | + data-text-image-rowcontainer-width-xs="0" | |
| 11049 | + data-text-image-rowcontainer-class-xs=""> | |
| 11050 | + | |
| 11051 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/loan.html" target="_self" hrefnoextension="false">Mortgage loan</a><br> | |
| 11052 | +</p> | |
| 11053 | +<p style="text-align: center;">Get financing for your project.<br> | |
| 11054 | +</p> | |
| 11055 | +</div> | |
| 11056 | + </div> | |
| 11057 | + | |
| 11058 | + | |
| 11059 | + | |
| 11060 | + | |
| 11061 | + | |
| 11062 | + | |
| 11063 | + | |
| 11064 | + | |
| 11065 | + | |
| 11066 | + | |
| 11067 | + | |
| 11068 | + <script> | |
| 11069 | + | |
| 11070 | + (function(){ | |
| 11071 | + | |
| 11072 | + var dataLayerViewEventName = '' || ''; | |
| 11073 | + var dataLayerViewLayerProperties = []; | |
| 11074 | + var $el; | |
| 11075 | + | |
| 11076 | + | |
| 11077 | + | |
| 11078 | + if(dataLayerViewEventName.trim().length) { | |
| 11079 | + | |
| 11080 | + var obj = { | |
| 11081 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 11082 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_panelcontainer_parsys_columns_parsys1_panelcontainer_parsys_textandimage" , | |
| 11083 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 11084 | + }; | |
| 11085 | + | |
| 11086 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 11087 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 11088 | + if(document.currentScript){ | |
| 11089 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 11090 | + } else { | |
| 11091 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 11092 | + var currentScript = scripts[scripts.length - 1]; | |
| 11093 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 11094 | + } | |
| 11095 | + | |
| 11096 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 11097 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 11098 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 11099 | + | |
| 11100 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 11101 | + | |
| 11102 | + } | |
| 11103 | + | |
| 11104 | + })(); | |
| 11105 | + | |
| 11106 | + </script> | |
| 11107 | + | |
| 11108 | +</div> | |
| 11109 | + | |
| 11110 | + <script> | |
| 11111 | + | |
| 11112 | + /** | |
| 11113 | + * clickEventDownloadHandler() | |
| 11114 | + * Is used to handle download image action selected as an opening mode | |
| 11115 | + * | |
| 11116 | + */ | |
| 11117 | + | |
| 11118 | + var firstDownload = true; | |
| 11119 | + | |
| 11120 | + function clickEventDownloadHandler() { | |
| 11121 | + | |
| 11122 | + var link = this; | |
| 11123 | + var filename = link.dataset.linkpath; | |
| 11124 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 11125 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 11126 | + | |
| 11127 | + if (newFile) { | |
| 11128 | + | |
| 11129 | + if (firstDownload) { | |
| 11130 | + firstDownload = false; | |
| 11131 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 11132 | + } else { | |
| 11133 | + this.href = link.href; | |
| 11134 | + } | |
| 11135 | + | |
| 11136 | + this.download = fn; | |
| 11137 | + | |
| 11138 | + } else { | |
| 11139 | + this.download = fn + ".html"; | |
| 11140 | + } | |
| 11141 | + } | |
| 11142 | + | |
| 11143 | + </script></div> | |
| 11144 | + | |
| 11145 | +</div> | |
| 11146 | + | |
| 11147 | +</div> | |
| 11148 | + | |
| 11149 | + | |
| 11150 | + | |
| 11151 | +<!--/* Initialize Js */--> | |
| 11152 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_17189/parsys/panelcontainer/parsys/columns/parsys1/panelcontainer"> | |
| 11153 | + if(""){ | |
| 11154 | + new Websites.Sticky({ | |
| 11155 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_17189/parsys/panelcontainer/parsys/columns/parsys1/panelcontainer", | |
| 11156 | + breakpoint: { | |
| 11157 | + lg: { | |
| 11158 | + to: "none" | |
| 11159 | + }, | |
| 11160 | + md: { | |
| 11161 | + to: "none" | |
| 11162 | + }, | |
| 11163 | + sm: { | |
| 11164 | + to: "none", | |
| 11165 | + }, | |
| 11166 | + xs: { | |
| 11167 | + to: "none" | |
| 11168 | + } | |
| 11169 | + } | |
| 11170 | + }); | |
| 11171 | + } | |
| 11172 | +</script> | |
| 11173 | + | |
| 11174 | +</div> | |
| 11175 | +</div> | |
| 11176 | + | |
| 11177 | +</div> | |
| 11178 | + | |
| 11179 | + </div> | |
| 11180 | + | |
| 11181 | + <div class="col-xs-12 col-sm-4 column separatorFilet"> | |
| 11182 | + <div class="parsys2 parsys"><div class="panelContainer section"> | |
| 11183 | + | |
| 11184 | + | |
| 11185 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 11186 | + | |
| 11187 | + | |
| 11188 | + | |
| 11189 | + <div> | |
| 11190 | + | |
| 11191 | + | |
| 11192 | + | |
| 11193 | + | |
| 11194 | + | |
| 11195 | + | |
| 11196 | + | |
| 11197 | + | |
| 11198 | + | |
| 11199 | + | |
| 11200 | + | |
| 11201 | + | |
| 11202 | + | |
| 11203 | + | |
| 11204 | + | |
| 11205 | + | |
| 11206 | + | |
| 11207 | + | |
| 11208 | + | |
| 11209 | + | |
| 11210 | + | |
| 11211 | + | |
| 11212 | + | |
| 11213 | +<div class="panelContainer " | |
| 11214 | + | |
| 11215 | + | |
| 11216 | + data-websites-component="/components/panelContainer.v1" | |
| 11217 | + data-panel-container-lg-mg="" | |
| 11218 | + data-panel-container-lg-pd="30px 20px 20px 20px" | |
| 11219 | + data-panel-container-lg-ht="" | |
| 11220 | + data-panel-container-md-mg="" | |
| 11221 | + data-panel-container-md-pd="30px 20px 20px 20px" | |
| 11222 | + data-panel-container-md-ht="" | |
| 11223 | + data-panel-container-sm-mg="" | |
| 11224 | + data-panel-container-sm-pd="30px 20px 20px 20px" | |
| 11225 | + data-panel-container-sm-ht="" | |
| 11226 | + data-panel-container-xs-mg="" | |
| 11227 | + data-panel-container-xs-pd="30px 20px 20px 20px" | |
| 11228 | + data-panel-container-xs-ht="" | |
| 11229 | + data-panel-container-limit=""> | |
| 11230 | + <div class="parsys"><div class="textandimage parbase section"> | |
| 11231 | + | |
| 11232 | + | |
| 11233 | + | |
| 11234 | + | |
| 11235 | + | |
| 11236 | + | |
| 11237 | + | |
| 11238 | + | |
| 11239 | + | |
| 11240 | + | |
| 11241 | + | |
| 11242 | + | |
| 11243 | + | |
| 11244 | + | |
| 11245 | + | |
| 11246 | + <div id="87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_panelcontainer_parsys_columns_parsys2_panelcontainer_copy_parsys_textandimage" class="text-image-container " | |
| 11247 | + data-text-image-container-right-left="false"> | |
| 11248 | + | |
| 11249 | + | |
| 11250 | + | |
| 11251 | + | |
| 11252 | + | |
| 11253 | + | |
| 11254 | + | |
| 11255 | + | |
| 11256 | + | |
| 11257 | + <div class="row text-image-row" | |
| 11258 | + data-websites-component="/components/textandimage/rowcontainer" | |
| 11259 | + | |
| 11260 | + data-text-image-rowcontainer-bg-type-lg="" | |
| 11261 | + | |
| 11262 | + | |
| 11263 | + | |
| 11264 | + | |
| 11265 | + | |
| 11266 | + data-text-image-rowcontainer-height-lg="0" | |
| 11267 | + data-text-image-rowcontainer-width-lg="0" | |
| 11268 | + data-text-image-rowcontainer-class-lg="" | |
| 11269 | + | |
| 11270 | + data-text-image-rowcontainer-bg-type-md="" | |
| 11271 | + | |
| 11272 | + | |
| 11273 | + | |
| 11274 | + | |
| 11275 | + | |
| 11276 | + data-text-image-rowcontainer-height-md="0" | |
| 11277 | + data-text-image-rowcontainer-width-md="0" | |
| 11278 | + data-text-image-rowcontainer-class-md="" | |
| 11279 | + | |
| 11280 | + data-text-image-rowcontainer-bg-type-sm="" | |
| 11281 | + | |
| 11282 | + | |
| 11283 | + | |
| 11284 | + | |
| 11285 | + | |
| 11286 | + data-text-image-rowcontainer-height-sm="0" | |
| 11287 | + data-text-image-rowcontainer-width-sm="0" | |
| 11288 | + data-text-image-rowcontainer-class-sm="" | |
| 11289 | + | |
| 11290 | + data-text-image-rowcontainer-bg-type-xs="" | |
| 11291 | + | |
| 11292 | + | |
| 11293 | + | |
| 11294 | + | |
| 11295 | + | |
| 11296 | + data-text-image-rowcontainer-height-xs="0" | |
| 11297 | + data-text-image-rowcontainer-width-xs="0" | |
| 11298 | + data-text-image-rowcontainer-class-xs=""> | |
| 11299 | + | |
| 11300 | + <div class="col-xs-12 text-image-text-container " ><p style="text-align: center;"><a href="/personal/mortgages/all-in-one.html" target="_self" hrefnoextension="false">Home equity line of credit</a><br> | |
| 11301 | +</p> | |
| 11302 | +<p style="text-align: center;">Use the repaid amount of your mortgage to realize new projects.<br> | |
| 11303 | +</p> | |
| 11304 | +</div> | |
| 11305 | + </div> | |
| 11306 | + | |
| 11307 | + | |
| 11308 | + | |
| 11309 | + | |
| 11310 | + | |
| 11311 | + | |
| 11312 | + | |
| 11313 | + | |
| 11314 | + | |
| 11315 | + | |
| 11316 | + | |
| 11317 | + <script> | |
| 11318 | + | |
| 11319 | + (function(){ | |
| 11320 | + | |
| 11321 | + var dataLayerViewEventName = '' || ''; | |
| 11322 | + var dataLayerViewLayerProperties = []; | |
| 11323 | + var $el; | |
| 11324 | + | |
| 11325 | + | |
| 11326 | + | |
| 11327 | + if(dataLayerViewEventName.trim().length) { | |
| 11328 | + | |
| 11329 | + var obj = { | |
| 11330 | + dataLayerViewEventName: dataLayerViewEventName, | |
| 11331 | + componentId: "87271788-642c-4f90-8e57-d2a4b74cca89_parsys_panelcontainer_189659515_parsys_panelcontainer_17189_parsys_panelcontainer_parsys_columns_parsys2_panelcontainer_copy_parsys_textandimage" , | |
| 11332 | + dataLayerViewLayerProperties: dataLayerViewLayerProperties | |
| 11333 | + }; | |
| 11334 | + | |
| 11335 | + // IE11 trick (because IE11 don't know document.currentScript): | |
| 11336 | + https://stackoverflow.com/questions/403967/how-may-i-reference-the-script-tag-that-loaded-the-currently-executing-script | |
| 11337 | + if(document.currentScript){ | |
| 11338 | + $el = document.currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 11339 | + } else { | |
| 11340 | + var scripts = document.getElementsByTagName( 'script' ); | |
| 11341 | + var currentScript = scripts[scripts.length - 1]; | |
| 11342 | + $el = currentScript.parentNode.getElementsByClassName('text-image-text-container')[0]; | |
| 11343 | + } | |
| 11344 | + | |
| 11345 | + $el.setAttribute('data-dataLayerViewEventJson', JSON.stringify( | |
| 11346 | + Websites.DataLayer.cleanViewEventJSON(obj))); | |
| 11347 | + $el.setAttribute("data-dataLayerViewEvent", 'true'); | |
| 11348 | + | |
| 11349 | + Websites.DataLayer.updateDataLayerViewEventElementsArray(); | |
| 11350 | + | |
| 11351 | + } | |
| 11352 | + | |
| 11353 | + })(); | |
| 11354 | + | |
| 11355 | + </script> | |
| 11356 | + | |
| 11357 | +</div> | |
| 11358 | + | |
| 11359 | + <script> | |
| 11360 | + | |
| 11361 | + /** | |
| 11362 | + * clickEventDownloadHandler() | |
| 11363 | + * Is used to handle download image action selected as an opening mode | |
| 11364 | + * | |
| 11365 | + */ | |
| 11366 | + | |
| 11367 | + var firstDownload = true; | |
| 11368 | + | |
| 11369 | + function clickEventDownloadHandler() { | |
| 11370 | + | |
| 11371 | + var link = this; | |
| 11372 | + var filename = link.dataset.linkpath; | |
| 11373 | + var newFile = filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2); | |
| 11374 | + var fn = filename.substring(filename.lastIndexOf('/')+1); | |
| 11375 | + | |
| 11376 | + if (newFile) { | |
| 11377 | + | |
| 11378 | + if (firstDownload) { | |
| 11379 | + firstDownload = false; | |
| 11380 | + this.href = link.href.slice(0, link.href.lastIndexOf('.')); | |
| 11381 | + } else { | |
| 11382 | + this.href = link.href; | |
| 11383 | + } | |
| 11384 | + | |
| 11385 | + this.download = fn; | |
| 11386 | + | |
| 11387 | + } else { | |
| 11388 | + this.download = fn + ".html"; | |
| 11389 | + } | |
| 11390 | + } | |
| 11391 | + | |
| 11392 | + </script></div> | |
| 11393 | + | |
| 11394 | +</div> | |
| 11395 | + | |
| 11396 | +</div> | |
| 11397 | + | |
| 11398 | + | |
| 11399 | + | |
| 11400 | +<!--/* Initialize Js */--> | |
| 11401 | +<script id="87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_17189/parsys/panelcontainer/parsys/columns/parsys2/panelcontainer_copy"> | |
| 11402 | + if(""){ | |
| 11403 | + new Websites.Sticky({ | |
| 11404 | + nodePath: "87271788-642c-4f90-8e57-d2a4b74cca89/parsys/panelcontainer_189659515/parsys/panelcontainer_17189/parsys/panelcontainer/parsys/columns/parsys2/panelcontainer_copy", | |
| 11405 | + breakpoint: { | |
| 11406 | + lg: { | |
| 11407 | + to: "none" | |
| 11408 | + }, | |
| 11409 | + md: { | |
| 11410 | + to: "none" | |
| 11411 | + }, | |
| 11412 | + sm: { | |
| 11413 | + to: "none", | |
| 11414 | + }, | |
| 11415 | + xs: { | |
| 11416 | + to: "none" | |
| 11417 | + } | |
| 11418 | + } | |
| 11419 | + }); | |
| 11420 | + } | |
| 11421 | +</script> | |
| 11422 | + | |
| 11423 | +</div> | |
| 11424 | +</div> | |
| 11425 | + | |
| 11426 | +</div> | |
| 11427 | + | |
| 11428 | + </div> | |
| 11429 | + | |
| 11430 | + <div class="col-xs-12 col-sm-4 column col-last "> | |
| 11431 | + <div class="parsys3 parsys"><div class="panelContainer section"> | |
| 11432 | + | |
| 11433 | + | |
| 11434 | +<div class="cq-placeholder" data-emptytext="web-sites.panelContainer.jcrTitle.label"></div> | |
| 11435 | + | |
| 11436 | + | |
| 11437 | + | |
| 11438 | + <div> | |
| 11439 | + | |
| 11440 | + | |
| 11441 | + | |
| 11442 | + | |
| 11443 | + | |
| 11444 | + | |
| 11445 | + | |
| 11446 | + | |
| 11447 | + | |
| 11448 | + | |
| 11449 | + | |
Diff truncated — file too large.