Julian Henry's Blog

πŸ“¦ Tatuagem: Stamp Text Across Your Entire Codebase

10 Jan 2026

View on GitHub

Tatuagem (Portuguese for β€œtattoo”) v.0.1.4 is done.

This was a fun collaboration between me and @DerekDickerson. The idea is stupid simple: you have a directory of source files, and you want to stamp a text banner – β€œCONFIDENTIAL”, β€œDRAFT”, β€œCOPYRIGHT 2026 ACME CORP”, whatever – across every single file, recursively. A tattoo for your code.

You can find the project on PyPI at https://pypi.org/project/tatuagem/ and on GitHub.

Why This Exists

I kept running into the same annoyance: corporate projects that require license headers, confidentiality banners, or copyright notices at the top of every source file. You can write a bash one-liner with find and sed, sure. But then you need to handle different file types (some use # comments, some use //, some use /* */), you need to avoid double-stamping files that already have the banner, and you need to not accidentally corrupt binary files. It is the kind of task that feels like it should take five minutes and actually takes an hour of edge-case whacking.

Tatuagem handles all of this. One command.

How It Works

Under the hood, Tatuagem walks your directory tree with os.walk, filters files by a glob pattern (default *.*), reads each file, prepends the text banner with a configurable β€œbacksplash” decoration (the line art surrounding the text), and writes it back. The text rendering uses Pillow’s ImageFont and ImageDraw to rasterize the banner text into ASCII art – so your stamp is not just plain text, it is a rendered block of Unicode characters that looks intentional and professional.

The font rendering pipeline is the interesting bit. Tatuagem loads a TrueType font (bundled or user-specified), renders the text string into a Pillow Image, then converts each pixel into a Unicode block character based on brightness. The result is a text-art banner that scales with font size and works in any monospace environment – terminals, source files, log outputs.

Usage

pip install tatuagem
usage: tatuagem [-h] [--text TEXT] [--backsplash BACKSPLASH] [--font FONT]
                [--pattern PATTERN] [--margin MARGIN] [--recurse-path RECURSE_PATH]
                [--file FILE] [--overwrite]

Tatuagem

options:
  -h, --help            show this help message and exit
  --text TEXT           Set the text
  --backsplash BACKSPLASH
                        Choose backsplash
  --font FONT           Set the font
  --pattern PATTERN     Set the pattern for backsplash
  --margin MARGIN       Margin top and bottom for text
  --recurse-path RECURSE_PATH
                        Path to recurse and apply tattoo
  --file FILE, -f FILE  Read text from file
  --overwrite           Overwrite existing tattoos in files

To use it, you can simply run it with the text you want to β€œtattoo” onto your files:

tatuagem --text "CONFIDENTIAL" --recurse-path ./src

Want a different font? Different decoration style? Read the text from a file instead of the command line?

tatuagem --text "DRAFT v2.0" --font ./myfont.ttf --backsplash 2 --recurse-path ./docs
tatuagem --file ./license_header.txt --pattern "*.py" --recurse-path ./src --overwrite

The --overwrite flag is key: it detects existing tatuagem stamps and replaces them rather than stacking duplicates. Without it, running the command twice would give you two banners. With it, the old tattoo gets cleanly replaced.

Design Choices

  1. Pillow for text rendering: I could have used a simpler ASCII art library, but Pillow gives us TrueType font support, which means the banner actually looks good. The pixel-to-Unicode conversion uses the block characters β–β–Žβ–β–Œβ–‹β–Šβ–‰β–ˆ (among others) to approximate grayscale values. The result is surprisingly legible even at small font sizes.

  2. Recursive by default, filterable by pattern: The --pattern flag lets you target only .py files, only .js files, or whatever subset you care about. No accidental tattooing of your .png files.

  3. File-based text input: The --file flag reads the stamp text from a file, which is useful for multi-line license headers that would be awkward to pass as a CLI argument.

Derek handled the backsplash decoration system – the border art that frames the text – while I focused on the recursive file walking and the overwrite detection. Good division of labor for a weekend project.

Built in Python. Published on PyPI. Does one thing. Does it well.

                   β–‹β–„β–„β–„β–„β–‚β–‰β–‹β–Ž                                   β–β–Žβ–‹β–‰β–‚β–„β–„β–„β–ƒβ–Œ                       
                   β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–…β–…β–ˆβ–‡β–ƒβ–‰β–      β–β–Œ            β–Œ       β–β–‰β–ƒβ–†β–†β–„β–†β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„                       
                   β–β–ˆβ–ˆβ–ˆβ–†β–‡β–ƒβ–‡β–ˆβ–ˆβ–ˆβ–…β–…β–…β–β–Œβ–   ▍▍          β–Œβ–   β–β–Œβ–‚β–†β–…β–…β–ˆβ–ˆβ–ˆβ–†β–„β–†β–†β–ˆβ–ˆβ–ˆβ–‹                       
                    β–„β–ˆβ–ˆβ–‚β–„β–ˆβ–ˆβ–ˆβ–ˆβ–…β–Šβ–ƒβ–ˆβ–ˆβ–ˆβ–‡β–β–  β–β–β–Ž      β–Žβ–β–  β–β–‚β–‡β–ˆβ–ˆβ–ˆβ–β–‰β–†β–ˆβ–ˆβ–ˆβ–ˆβ–„β–ƒβ–ˆβ–ˆβ–                        
                    β–β–‚β–ˆβ–‡β–ˆβ–ˆβ–‰β–β–β–Œβ–Šβ–…β–β–β–β–β–‡β–ˆβ–…β–Šβ– β–β–β–Ž  β–Žβ–β– β–β–Šβ–…β–ˆβ–†β–β–β–Œβ–‚β–…β–Šβ–Œβ–β–β–β–ˆβ–ˆβ–‡β–‡β–‰                         
                      β–‰β–ˆβ–ˆβ–‡β–ƒβ–Œβ–Œβ–β–β–Œβ–‹β–Œβ– β–β–‹β–‡β–ˆβ–‡β–‰β– β–Žβ–‹β–‹β–Ž β–β–‰β–‡β–ˆβ–†β–‹β– β–β–Œβ–‹β–Œβ–β–β–β–‹β–„β–‡β–ˆβ–ˆβ–‹                          
                      β–β–‡β–ˆβ–‡β–Šβ–β–β–β–β–β–β–Œβ–‹β–‹β–Œβ–β–†β–ˆβ–ˆβ–ˆβ–‡β–Šβ–‚β–ˆβ–ˆβ–‰β–‰β–‡β–ˆβ–ˆβ–‡β–‚β–Œβ–‹β–‹β–Šβ–Œβ–β–β–β–β–β–β–β–‡β–ˆβ–…                           
                       β–β–ˆβ–ˆβ–ƒβ–Ž   β–β–β–β–Œβ–‹β–‚β–†β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–†β–„β–‹β–β–β–β–  β–β–β–„β–ˆβ–ˆβ–Ž                           
                        β–β–ˆβ–‡β–β–Œβ–β–β–Žβ–    β–β–Šβ–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–†β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‚β–Ž     β–β–Žβ–β–β–‹β–‚β–ˆβ–ˆβ–Š                            
                        β–β–ƒβ–ˆβ–†β–Šβ–‹β–‰β–‚β–„β–†β–‡β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡β–‡β–†β–„β–‚β–‰β–‹β–‰β–‡β–ˆβ–‰                             
                          β–‹β–ƒβ–†β–‡β–‡β–‡β–ˆβ–ˆβ–„β–β–β–β–„β–Šβ–‰β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡β–Šβ–‹β–ƒβ–β–‚β–‚β–„β–ˆβ–ˆβ–†β–‡β–‡β–†β–ƒβ–Œ                              
                              β–‰β–ˆβ–ˆβ–‚β–β–β–β–Šβ–Ž  β–β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰  β–Žβ–‹β–β–β–β–„β–ˆβ–‡β–Š                                  
                             β–Œβ–ˆβ–ˆβ–‡β–Œβ–β–β–Žβ–Šβ–β–β–Šβ–Žβ–ƒβ–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‚β–Žβ–‹β–β–β–‹β–Žβ–β–β–Œβ–ˆβ–ˆβ–ˆβ–Ž                                 
                             β–‹β–ˆβ–ˆβ–ˆβ–‹β–Žβ–Œβ–Žβ–Šβ–β–Œβ–β–β–Žβ–†β–ˆβ–ˆβ–ˆβ–ˆβ–…β–Œβ–Žβ–β–Œβ–β–‹β–Žβ–Œβ–β–‚β–ˆβ–ˆβ–ˆβ–                                 
                              β–†β–ˆβ–‡β–ˆβ–„β–Žβ–Šβ–β–β–‹ β–‹ β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–…β–β–‹ β–‹β–β–Žβ–Šβ–Œβ–…β–ˆβ–‡β–ˆβ–„                                  
                              β–β–„β–ˆβ–ˆβ–ˆβ–ˆβ–…β–‹β–‚β– β–Š β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–… β–Š β–Žβ–β–‹β–…β–ˆβ–ˆβ–ˆβ–ˆβ–ƒ                                   
                                β–Œβ–…β–ˆβ–‡β–ˆβ–‡β–ˆβ–†β–…β–…β–Šβ–‡β–ˆβ–ˆβ–ˆβ–ˆβ–‡β–‰β–†β–…β–†β–ˆβ–‡β–‡β–ˆβ–ˆβ–…β–Ž                                    
                                  β–Žβ–ƒβ–…β–‡β–ˆβ–‡β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡β–‡β–ˆβ–‡β–…β–ƒβ–Ž                                      
                                     β–β–„β–†β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–†β–ƒβ–Ž                                         
                                   β–β–‰β–‡β–‚β–β–‰β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡β–‰β–β–‚β–‡β–‰β–                                       
                                β–Žβ–Šβ–ƒβ–ˆβ–ˆβ–ˆβ–„  β–β–Šβ–…β–ˆβ–ˆβ–ˆβ–ˆβ–…β–Šβ–  β–ƒβ–ˆβ–ˆβ–ˆβ–ƒβ–Šβ–Ž                                    
                           β–β–β–Šβ–ƒβ–†β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–…β–Š   β–β–‰β–‡β–‡β–Š    β–‹β–…β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–†β–ƒβ–Šβ–β–                               
                       β–β–Œβ–β–„β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–†β–Žβ–Šβ–β–Žβ–Šβ–…β–ˆβ–ˆβ–…β–Šβ–Žβ–β–Šβ–Žβ–†β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–β–Œβ–                           
                     β–β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–β–β–Šβ–Œ β–β–ˆβ–ˆβ– β–β–Šβ–β–Žβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„                          
                     β–Œβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š    β–ƒβ–ˆβ–ˆβ–ƒ    β–Šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ                         
                     β–ƒβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„   β–β–ˆβ–ˆβ–ˆβ–ˆβ–   β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‚                         
                    β–β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Ž  β–Œβ–ˆβ–ˆβ–ˆβ–ˆβ–  β–Žβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–†                         
                    β–β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–  β–Šβ–ˆβ–ˆβ–ˆβ–ˆβ–Š  β–β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–                        
                    β–Šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡β– β–β–ˆβ–ˆβ–ˆβ–ˆβ– β–β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–†β–ƒβ–‰β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Œ                        
                    β–β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ β–‚β–ˆβ–ˆβ–ˆβ–ˆβ–‚ β–‰β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„β–β–Šβ–‰β–β–‚β–†β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Š                        
                    β–ƒβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡β–β–„β–ˆβ–ˆβ–ˆβ–ˆβ–„β–β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–                        
                    β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–β–„β–ˆβ–ˆβ–ˆβ–ˆβ–„β–β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ƒ                        
                    β–…β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡β–ˆβ–ˆβ–ˆβ–ˆβ–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„                        
                    β–†β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–…                        
                    β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–…                        
                    β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‚β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‚β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–…                        
                    β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–†β–β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–Žβ–†β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–…                        
                    β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ– β–†β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–† β–β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–…                        
                    β–‡β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–… β–…β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–… β–„β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‡                        
                    β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–‰ β–…β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–‰β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ                        
                    β–„β–„β–„β–„β–„β–„β–„β–…β–‚ β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–‚ β–‚β–„β–„β–„β–„β–„β–„β–„β–ƒ