radio: private radio tracker (/trackers/radio): frequencies, UBC125XLT banks + CSV, nets, ISS passes over Gouda, listening log, ntfy reminders
Deploy production / deploy (push) Successful in 1m26s
Deploy production / deploy (push) Successful in 1m26s
This commit is contained in:
1 parent
e24ee7f95d
commit
03574a95a7
37 files changed
+48839
-3
No files matched your search
@@ -0,0 +1,141 @@
|
||||
CREATE SCHEMA "radio";
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "radio"."channels" (
|
||||
"channel" smallint PRIMARY KEY,
|
||||
"frequency_id" integer NOT NULL,
|
||||
"alpha_tag" text,
|
||||
"delay" boolean DEFAULT true NOT NULL,
|
||||
"lockout" boolean DEFAULT false NOT NULL,
|
||||
"priority" boolean DEFAULT false NOT NULL,
|
||||
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT "channels_channel_check" CHECK ("channel" BETWEEN 1 AND 500),
|
||||
CONSTRAINT "channels_alpha_tag_check" CHECK (char_length("alpha_tag") <= 16)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "radio"."frequencies" (
|
||||
"id" serial PRIMARY KEY,
|
||||
"freq_hz" bigint NOT NULL,
|
||||
"mode" text DEFAULT 'FM' NOT NULL,
|
||||
"band" text NOT NULL,
|
||||
"name" text NOT NULL,
|
||||
"location" text,
|
||||
"notes" text,
|
||||
"marine_ch" text,
|
||||
"tags" text[] DEFAULT '{}'::text[] NOT NULL,
|
||||
"source" text,
|
||||
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT "frequencies_mode_check" CHECK ("mode" IN ('FM','NFM','AM','USB','LSB','CW','DATA')),
|
||||
CONSTRAINT "frequencies_band_check" CHECK ("band" IN ('marine','air','ham','pmr','other')),
|
||||
CONSTRAINT "frequencies_freq_check" CHECK ("freq_hz" > 0)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "radio"."iss_passes" (
|
||||
"start_at" timestamp with time zone PRIMARY KEY,
|
||||
"max_at" timestamp with time zone NOT NULL,
|
||||
"end_at" timestamp with time zone NOT NULL,
|
||||
"max_el" real NOT NULL,
|
||||
"start_az" real NOT NULL,
|
||||
"max_az" real NOT NULL,
|
||||
"end_az" real NOT NULL,
|
||||
"sunlit" boolean DEFAULT false NOT NULL,
|
||||
"computed_at" timestamp with time zone DEFAULT now() NOT NULL
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "radio"."iss_tle" (
|
||||
"id" smallint PRIMARY KEY DEFAULT 1,
|
||||
"name" text NOT NULL,
|
||||
"line1" text NOT NULL,
|
||||
"line2" text NOT NULL,
|
||||
"epoch" timestamp with time zone NOT NULL,
|
||||
"fetched_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT "iss_tle_single_check" CHECK ("id" = 1)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "radio"."log" (
|
||||
"id" serial PRIMARY KEY,
|
||||
"heard_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
"frequency_id" integer,
|
||||
"freq_hz" bigint,
|
||||
"mode" text,
|
||||
"what" text NOT NULL,
|
||||
"signal" smallint,
|
||||
"notes" text,
|
||||
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT "log_signal_check" CHECK ("signal" BETWEEN 1 AND 5)
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "radio"."nets" (
|
||||
"id" serial PRIMARY KEY,
|
||||
"name" text NOT NULL,
|
||||
"frequency_id" integer,
|
||||
"days" smallint[] DEFAULT '{}'::smallint[] NOT NULL,
|
||||
"times" text[] DEFAULT '{}'::text[] NOT NULL,
|
||||
"duration_min" integer,
|
||||
"kind" text DEFAULT 'net' NOT NULL,
|
||||
"notes" text,
|
||||
"remind" boolean DEFAULT true NOT NULL,
|
||||
"active" boolean DEFAULT true NOT NULL,
|
||||
"sort_order" integer DEFAULT 0 NOT NULL,
|
||||
"created_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
"updated_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT "nets_kind_check" CHECK ("kind" IN ('net','broadcast','other')),
|
||||
CONSTRAINT "nets_days_check" CHECK ("days" <@ '{1,2,3,4,5,6,7}'::smallint[]),
|
||||
CONSTRAINT "nets_times_check" CHECK (array_to_string("times", ',') ~ '^(([01][0-9]|2[0-3]):[0-5][0-9](,|$))*$')
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE TABLE "radio"."reminders" (
|
||||
"kind" text,
|
||||
"ref_id" integer,
|
||||
"at" timestamp with time zone,
|
||||
"sent_at" timestamp with time zone DEFAULT now() NOT NULL,
|
||||
CONSTRAINT "reminders_pkey" PRIMARY KEY("kind","ref_id","at"),
|
||||
CONSTRAINT "reminders_kind_check" CHECK ("kind" IN ('net','iss'))
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE INDEX "channels_frequency_idx" ON "radio"."channels" ("frequency_id");--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX "frequencies_freq_name_key" ON "radio"."frequencies" ("freq_hz","name");--> statement-breakpoint
|
||||
CREATE INDEX "frequencies_band_idx" ON "radio"."frequencies" ("band");--> statement-breakpoint
|
||||
CREATE INDEX "iss_passes_end_idx" ON "radio"."iss_passes" ("end_at");--> statement-breakpoint
|
||||
CREATE INDEX "log_heard_idx" ON "radio"."log" ("heard_at");--> statement-breakpoint
|
||||
CREATE INDEX "log_frequency_idx" ON "radio"."log" ("frequency_id");--> statement-breakpoint
|
||||
ALTER TABLE "radio"."channels" ADD CONSTRAINT "channels_frequency_id_frequencies_id_fkey" FOREIGN KEY ("frequency_id") REFERENCES "radio"."frequencies"("id") ON DELETE CASCADE ON UPDATE CASCADE;--> statement-breakpoint
|
||||
ALTER TABLE "radio"."log" ADD CONSTRAINT "log_frequency_id_frequencies_id_fkey" FOREIGN KEY ("frequency_id") REFERENCES "radio"."frequencies"("id") ON DELETE SET NULL ON UPDATE CASCADE;--> statement-breakpoint
|
||||
ALTER TABLE "radio"."nets" ADD CONSTRAINT "nets_frequency_id_frequencies_id_fkey" FOREIGN KEY ("frequency_id") REFERENCES "radio"."frequencies"("id") ON DELETE SET NULL ON UPDATE CASCADE;--> statement-breakpoint
|
||||
-- Seed: Opa Chiel's lists (airband banks 4-6, marine banks 7-10) and the extras from his notes.
|
||||
INSERT INTO "radio"."frequencies" (freq_hz, mode, band, name, location, notes, marine_ch, tags, source)
|
||||
SELECT x.freq_hz, x.mode, x.band, x.name, x.location, x.notes, x.marine_ch,
|
||||
coalesce(ARRAY(SELECT jsonb_array_elements_text(x.tags)), '{}'), x.source
|
||||
FROM jsonb_to_recordset($seed$[{"freq_hz": 118100000, "mode": "AM", "band": "air", "name": "Schiphol Tower Primary Baan 18C-36C Zwanenburgbaan", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["tower"], "source": "Opa Chiel"}, {"freq_hz": 118200000, "mode": "AM", "band": "air", "name": "Rotterdam Tower", "location": "Rotterdam", "notes": null, "marine_ch": null, "tags": ["tower"], "source": "Opa Chiel"}, {"freq_hz": 118250000, "mode": "AM", "band": "air", "name": "Brussel Approach", "location": "Brussels", "notes": null, "marine_ch": null, "tags": ["approach"], "source": "Opa Chiel"}, {"freq_hz": 118275000, "mode": "AM", "band": "air", "name": "Schiphol Tower Baan 18R-36L Polderbaan Tower West", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["tower"], "source": "Opa Chiel"}, {"freq_hz": 118400000, "mode": "AM", "band": "air", "name": "Schiphol Arrival / London Area Control Sector 14 Clacton W.", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["approach", "acc"], "source": "Opa Chiel"}, {"freq_hz": 118475000, "mode": "AM", "band": "air", "name": "London Area Control Sector 14 Clacton West", "location": "London", "notes": "8.33 kHz channel; actual frequency 118.480 MHz", "marine_ch": null, "tags": ["acc"], "source": "Opa Chiel"}, {"freq_hz": 118800000, "mode": "AM", "band": "air", "name": "Schiphol Radar Sugol", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["radar"], "source": "Opa Chiel"}, {"freq_hz": 119050000, "mode": "AM", "band": "air", "name": "Schiphol Approach Departure TMA East", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["approach"], "source": "Opa Chiel"}, {"freq_hz": 119225000, "mode": "AM", "band": "air", "name": "Schiphol Tower Baan 04-22 Oostbaan en 18L-36R Aalsmeerbaan", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["tower"], "source": "Opa Chiel"}, {"freq_hz": 119575000, "mode": "AM", "band": "air", "name": "Noordzee Heli's", "location": "North Sea", "notes": null, "marine_ch": null, "tags": ["heli"], "source": "Opa Chiel"}, {"freq_hz": 119700000, "mode": "AM", "band": "air", "name": "Rotterdam Tower", "location": "Rotterdam", "notes": null, "marine_ch": null, "tags": ["tower"], "source": "Opa Chiel"}, {"freq_hz": 119900000, "mode": "AM", "band": "air", "name": "Schiphol Tower 06-24 Kaagbaan", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["tower"], "source": "Opa Chiel"}, {"freq_hz": 120125000, "mode": "AM", "band": "air", "name": "Den Helder De Kooy Tower", "location": "Den Helder", "notes": null, "marine_ch": null, "tags": ["tower"], "source": "Opa Chiel"}, {"freq_hz": 120550000, "mode": "AM", "band": "air", "name": "Schiphol Radar IJsselmeer Artip", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["radar"], "source": "Opa Chiel"}, {"freq_hz": 120825000, "mode": "AM", "band": "air", "name": "Nieuw Milligen Dutch Mil Radar Upper", "location": "Nieuw Milligen", "notes": null, "marine_ch": null, "tags": ["radar", "military"], "source": "Opa Chiel"}, {"freq_hz": 121200000, "mode": "AM", "band": "air", "name": "Schiphol Approach Departure TMA West Polderbaan Toren", "location": "Schiphol", "notes": null, "marine_ch": null, "tags": ["tower", "approach"], "source": "Opa Chiel"}, {"freq_hz": 121500000, "mode": "AM", "band": "air", "name": "International Emergency Frequency", "location": null, "notes": "Guard frequency, monitored by all aircraft.", "marine_ch": null, "tags": ["emergency"], "source": "Opa Chiel"}, {"freq_hz": 121750000, "mode": "AM", "band": "air", "name": "Rotterdam Toren Havendienst / Brussel Luxemburg", "location": "Rotterdam", "notes": null, "marine_ch": null, "tags": ["tower"], "source": "Opa Chiel"}, {"freq_hz": 122175000, "mode": "AM", "band": "air", "name": "Rotterdam Delivery", "location": "Rotterdam", "notes": null, "marine_ch": null, "tags": [], "source": "Opa Chiel"}, {"freq_hz": 122250000, "mode": "AM", "band": "air", "name": "Luchtballonnen", "location": null, "notes": null, "marine_ch": null, "tags": [], "source": "Opa Chiel"}, {"freq_hz": 122475000, "mode": "AM", "band": "air", "name": "Zweefvliegtuigen", "location": null, "notes": null, "marine_ch": null, "tags": ["gliders"], "source": "Opa Chiel"}, {"freq_hz": 122500000, "mode": "AM", "band": "air", "name": "Zweefvliegtuigen", "location": null, "notes": null, "marine_ch": null, "tags": ["gliders"], "source": "Opa Chiel"}, {"freq_hz": 122600000, "mode": "AM", "band": "air", "name": "Ballonvaart", "location": null, "notes": null, "marine_ch": null, "tags": ["balloons"], "source": "Opa Chiel"}, {"freq_hz": 122950000, "mode": "AM", "band": "air", "name": "Noordzee Heli's", "location": "North Sea", "notes": null, "marine_ch": null, "tags": ["heli"], "source": "Opa Chiel"}, {"freq_hz": 123100000, "mode": "AM", "band": "air", "name": "Internationaal SAR Europa", "location": null, "notes": null, "marine_ch": null, "tags": ["sar"], "source": "Opa Chiel"}, {"freq_hLine truncated
|
||||
AS x(freq_hz bigint, mode text, band text, name text, location text, notes text, marine_ch text, tags jsonb, source text)
|
||||
ON CONFLICT (freq_hz, name) DO NOTHING;
|
||||
--> statement-breakpoint
|
||||
INSERT INTO "radio"."channels" (channel, frequency_id)
|
||||
SELECT c.channel, f.id
|
||||
FROM jsonb_to_recordset($seed$[{"channel": 151, "freq_hz": 118100000, "name": "Schiphol Tower Primary Baan 18C-36C Zwanenburgbaan"}, {"channel": 152, "freq_hz": 118200000, "name": "Rotterdam Tower"}, {"channel": 153, "freq_hz": 118250000, "name": "Brussel Approach"}, {"channel": 154, "freq_hz": 118275000, "name": "Schiphol Tower Baan 18R-36L Polderbaan Tower West"}, {"channel": 155, "freq_hz": 118400000, "name": "Schiphol Arrival / London Area Control Sector 14 Clacton W."}, {"channel": 156, "freq_hz": 118475000, "name": "London Area Control Sector 14 Clacton West"}, {"channel": 157, "freq_hz": 118800000, "name": "Schiphol Radar Sugol"}, {"channel": 158, "freq_hz": 119050000, "name": "Schiphol Approach Departure TMA East"}, {"channel": 159, "freq_hz": 119225000, "name": "Schiphol Tower Baan 04-22 Oostbaan en 18L-36R Aalsmeerbaan"}, {"channel": 160, "freq_hz": 119575000, "name": "Noordzee Heli's"}, {"channel": 161, "freq_hz": 119700000, "name": "Rotterdam Tower"}, {"channel": 162, "freq_hz": 119900000, "name": "Schiphol Tower 06-24 Kaagbaan"}, {"channel": 163, "freq_hz": 120125000, "name": "Den Helder De Kooy Tower"}, {"channel": 164, "freq_hz": 120550000, "name": "Schiphol Radar IJsselmeer Artip"}, {"channel": 165, "freq_hz": 120825000, "name": "Nieuw Milligen Dutch Mil Radar Upper"}, {"channel": 166, "freq_hz": 121200000, "name": "Schiphol Approach Departure TMA West Polderbaan Toren"}, {"channel": 167, "freq_hz": 121500000, "name": "International Emergency Frequency"}, {"channel": 168, "freq_hz": 121750000, "name": "Rotterdam Toren Havendienst / Brussel Luxemburg"}, {"channel": 169, "freq_hz": 122175000, "name": "Rotterdam Delivery"}, {"channel": 170, "freq_hz": 122250000, "name": "Luchtballonnen"}, {"channel": 171, "freq_hz": 122475000, "name": "Zweefvliegtuigen"}, {"channel": 172, "freq_hz": 122500000, "name": "Zweefvliegtuigen"}, {"channel": 173, "freq_hz": 122600000, "name": "Ballonvaart"}, {"channel": 174, "freq_hz": 122950000, "name": "Noordzee Heli's"}, {"channel": 175, "freq_hz": 123100000, "name": "Internationaal SAR Europa"}, {"channel": 176, "freq_hz": 123175000, "name": "Rapcon South Eindhoven Vonkel Gilze Rijen"}, {"channel": 177, "freq_hz": 123350000, "name": "Zweefvliegtuigen"}, {"channel": 178, "freq_hz": 123375000, "name": "Zweefvliegtuigen"}, {"channel": 179, "freq_hz": 123425000, "name": "Ultra Lights"}, {"channel": 180, "freq_hz": 123450000, "name": "Landelijk Air to Air Nat. Airdrome Northsea Heli"}, {"channel": 181, "freq_hz": 123500000, "name": "Zweefvliegtuigen"}, {"channel": 182, "freq_hz": 123575000, "name": "Rapcon West Woensdrecht"}, {"channel": 183, "freq_hz": 123700000, "name": "Schiphol Radar-5 North-West"}, {"channel": 184, "freq_hz": 123850000, "name": "Schiphol Radar-3 South"}, {"channel": 185, "freq_hz": 124225000, "name": "Den Helder De Kooy Arrival"}, {"channel": 186, "freq_hz": 124300000, "name": "Schiphol Flight Information Service Over Land en Lifeliner"}, {"channel": 187, "freq_hz": 124525000, "name": "Eindhoven Arrival"}, {"channel": 188, "freq_hz": 124875000, "name": "Schiphol Radar-2 East Outbound"}, {"channel": 189, "freq_hz": 125000000, "name": "Brussel ACC Radar Luxemburg Sector"}, {"channel": 190, "freq_hz": 125175000, "name": "Noordzee Heli's"}, {"channel": 191, "freq_hz": 125425000, "name": "Landelijk AFIS Hospital Heli"}, {"channel": 192, "freq_hz": 125750000, "name": "Schiphol Radar-4 South-West"}, {"channel": 193, "freq_hz": 125775000, "name": "Brussel ACC Radar West"}, {"channel": 194, "freq_hz": 125925000, "name": "Nieuw Milligen Dutch Mil Radar Spire"}, {"channel": 195, "freq_hz": 125975000, "name": "Maastricht Radar Eurocontrol Sector Olno High"}, {"channel": 196, "freq_hz": 126375000, "name": "Brussel ACC Radar North High"}, {"channel": 197, "freq_hz": 126525000, "name": "Brussel ACC Radar South Low"}, {"channel": 198, "freq_hz": 126625000, "name": "Brussel Airport Departure"}, {"channel": 199, "freq_hz": 126675000, "name": "Schiphol Arrival Back-Up / Rotterdam Approach Back-Up"}, {"channel": 200, "freq_hz": 126775000, "name": "London Area Control Sector 11 Noordzee"}, {"channel": 201, "freq_hz": 127025000, "name": "Rotterdam Approach"}, {"channel": 202, "freq_hz": 127225000, "name": "Brussel ACC Radar West High"}, {"channel": 203, "freq_hz": 127425000, "name": "London Area Control Sector 02 Upper Sector Oosten"}, {"channel": 204, "freq_hz": 128000000, "name": "Schiphol Politie Landelijke Eenheid Schiphol-Oost"}, {"channel": 205, "freq_hz": 128125000, "name": "London Area Control Sector 10 Noordzee"}, {"channel": 206, "freq_hz": 128158300, "name": "London Area Control Sector 13 Clacton West"}, {"channel": 207, "freq_hz": 128200000, "name": "Brussel ACC Radar East"}, {"channel": 208, "freq_hz": 128350000, "name": "Nieuw Milligen Dutch Mil Radar Lower"}, {"channel": 209, "freq_hz": 128425000, "name": "London Area Control Sector 17 Lydd"}, {"channel": 210, "freq_hz": 128450000, "name": "Brussel ACC Radar Luxemburg Sector"}, {"channel": 211, "freq_hz"Line truncated
|
||||
JOIN "radio"."frequencies" f ON f.freq_hz = c.freq_hz AND f.name = c.name
|
||||
ON CONFLICT (channel) DO NOTHING;
|
||||
--> statement-breakpoint
|
||||
INSERT INTO "radio"."nets" (name, frequency_id, days, times, kind, remind, sort_order, notes)
|
||||
SELECT n.name, f.id, ARRAY(SELECT jsonb_array_elements_text(n.days)::smallint),
|
||||
ARRAY(SELECT jsonb_array_elements_text(n.times)), n.kind, n.remind, n.sort_order, n.notes
|
||||
FROM jsonb_to_recordset($seed$[{"name": "Haagse ronde", "freq_hz": 145450000, "fname": "Haagse ronde", "days": [1, 2, 3, 4, 5], "times": ["11:00"], "kind": "net", "remind": true, "sort_order": 10, "notes": "The Hague 2 m net. Opa corrected 145.350 to 145.450. Listen on the scanner or WebSDR PI1DFT: https://websdr.pi1dft.ampr.org/#freq=145450000,mod=nfm,sql=-66"}, {"name": "Kustwacht weerbericht (ch 83)", "freq_hz": 161775000, "fname": "Kustwacht Wal Scheveningen", "days": [1, 2, 3, 4, 5, 6, 7], "times": ["13:05", "19:05"], "kind": "broadcast", "remind": true, "sort_order": 20, "notes": "Coastguard weather report on marine ch 83 (Scheveningen shore), scanner ch 353."}, {"name": "Kustwacht navigatieberichten (ch 83)", "freq_hz": 161775000, "fname": "Kustwacht Wal Scheveningen", "days": [1, 2, 3, 4, 5, 6, 7], "times": ["17:30"], "kind": "broadcast", "remind": false, "sort_order": 30, "notes": "Coastguard navigational warnings on marine ch 83, scanner ch 353."}, {"name": "KLM ronde (80 m)", "freq_hz": 3785000, "fname": "KLM ronde", "days": [7], "times": [], "kind": "net", "remind": false, "sort_order": 40, "notes": "3785 kHz LSB via WebSDR Maasbree. Regular time unknown: Opa saw it live on Sun 20 Sep 2026 12:34. Add a time once known."}]$seed$::jsonb)
|
||||
AS n(name text, freq_hz bigint, fname text, days jsonb, times jsonb, kind text, remind boolean, sort_order int, notes text)
|
||||
LEFT JOIN "radio"."frequencies" f ON f.freq_hz = n.freq_hz AND f.name = n.fname;
|
||||
--> statement-breakpoint
|
||||
-- Privacy: owner-only on the site (ownerOnlyPrefixes). Like plant and notes, only the app role
|
||||
-- can read or write (no personal_ro). Grants only run on prod (migrations as `personal`).
|
||||
REVOKE ALL ON SCHEMA radio FROM PUBLIC;
|
||||
--> statement-breakpoint
|
||||
DO $$
|
||||
BEGIN
|
||||
IF current_user = 'personal' AND EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'personal_app') THEN
|
||||
GRANT USAGE ON SCHEMA radio TO personal_app;
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA radio TO personal_app;
|
||||
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA radio TO personal_app;
|
||||
ALTER DEFAULT PRIVILEGES FOR ROLE personal IN SCHEMA radio
|
||||
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO personal_app;
|
||||
ALTER DEFAULT PRIVILEGES FOR ROLE personal IN SCHEMA radio
|
||||
GRANT USAGE, SELECT ON SEQUENCES TO personal_app;
|
||||
END IF;
|
||||
END $$;
|
||||
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user