_HOPF":
		s.Type = scmp.T_P_ExpiredHopF
	case "BAD_IF":
		s.Type = scmp.T_P_BadIF
	case "REVOKED_IF":
		s.Type = scmp.T_P_RevokedIF
	case "NON_ROUTING_HOPF":
		s.Type = scmp.T_P_NonRoutingHopF
	case "DELIVERY_NON_LOCAL":
		s.Type = scmp.T_P_DeliveryNonLocal
	case "BAD_SEGMENT":
		s.Type = scmp.T_P_BadSegment
	case "BAD_INFO_FIELD":
		s.Type = scmp.T_P_BadInfoField
	case "BAD_HOP_FIELD":
		s.Type = scmp.T_P_BadHopField
	case "TOO_MANY_HOPBYHOP":
		s.Type = scmp.T_E_TooManyHopbyHop
	case "BAD_EXT_ORDER":
		s.Type = scmp.T_E_BadExtOrder
	case "BAD_HOPBYHOP":
		s.Type = scmp.T_E_BadHopByHop
	case "BAD_END2END":
		s.Type = scmp.T_E_BadEnd2End
	case "SIBRA_BAD_VERSION":
		s.Type = scmp.T_S_BadVersion
	case "SETUP_NO_REQ":
		s.Type = scmp.T_S_SetupNoReq
	default:
		if c[:2] == "0x" {
			s.Type = scmp.Type(HexToInt(c[2:]))
		}
		panic(fmt.Errorf("Unknown SCMP Type '%s'", c))
	}
}

func (s *SCMPTaggedLayer) updateMetaFields(kvs propMap) {
	for k, v := range kvs {
		switch k {
		case "InfoLen":
			s.Meta.InfoLen = uint8(StrToInt(v))
		case "CmnHdrLen":
			s.Meta.CmnHdrLen = uint8(StrToInt(v))
		case "AddrHdrLen":
			s.Meta.AddrHdrLen = uint8(StrToInt(v))
		case "PathHdrLEn":
			s.Meta.PathHdrLen = uint8(StrToInt(v))
		case "ExtHdrsLen":
			s.Meta.ExtHdrsLen = uint8(StrToInt(v))
		case "L4HdrLen":
			s.Meta.L4HdrLen = uint8(StrToInt(v))
		case "L4Proto":
			s.Meta.L4Proto = parseScionProto(v)
		default:
			panic(fmt.Errorf("Unknown SCMP META field: %s", k))
		}
	}
}

func (s *SCMPTaggedLayer) updateQuotes(kvs propMap) {
	for k, v := range kvs {
		switch k {
		case "RawPkt":
			s.generatePayload(v)
		default:
			panic(fmt.Errorf("Unknown SCMP QUOTE field: %s", k))
		}
	}
}

func (s *SCMPTaggedLayer) generatePayload(rawPkt string) {
	raw := HexToBytes(rawPkt)
	// Build and parse the packet sent, which will be used to generate the expected quotes
	pkt := gopacket.NewPacket(raw, golayers.LayerTypeEthernet, gopacket.NoCopy)
	// Find SCION layer
	pktLayers := pkt.Layers()
	for i := range pktLayers {
		if pktLayers[i].LayerType() == layers.LayerTypeScion {
			pktLayers = pktLayers[i:]
			break
		}
	}
	if len(pktLayers) == len(pkt.Layers()) {
		panic(fmt.Errorf("Failed to generate expected SCMP quotes (SCION layer parsing)"))
	}
	scn := pktLayers[0].(*layers.Scion)
	qr := &quoteRaw{scion: scn}
	// Find L4 layer
	var l4Proto common.L4ProtocolType
	for idx := range pktLayers {
		l := pktLayers[idx]
		switch l.LayerType() {
		case layers.LayerTypeSCMP:
			qr.l4 = l
			l4Proto = common.L4SCMP
			break
		case golayers.LayerTypeUDP:
			qr.l4 = l
			l4Proto = common.L4UDP
			break
		}
	}
	if qr.l4 == nil {
		// XXX Likely a SCION extension parse error
		qr.l4 = pktLayers[len(pktLayers)]
	}
	ct := scmp.ClassType{Class: s.Class, Type: s.Type}
	pld := scmp.PldFromQuotes(ct, s.Info, l4Proto, qr.getRaw)
	s.Pld = pld
}

type quoteRaw struct {
	scion *layers.Scion
	l4    gopacket.Layer
}

// getRaw returns slices of the underlying buffer corresponding to part of the
// packet identified by the blk argument. This is used, for example, by SCMP to
// quote parts of the packet in an error response.
func (qr *quoteRaw) getRaw(blk scmp.RawBlock) common.RawBytes {
	scnRaw := qr.scion.Contents
	addrLen := qr.scion.AddrHdr.Len()
	scnPld := qr.scion.Payload
	extLen := len(scnPld) - len(qr.l4.LayerContents()) - len(qr.l4.LayerPayload())
	switch blk {
	case scmp.RawCmnHdr:
		return scnRaw[:spkt.CmnHdrLen]
	case scmp.RawAddrHdr:
		return scnRaw[spkt.CmnHdrLen : spkt.CmnHdrLen+addrLen]
	case scmp.RawPathHdr:
		return scnRaw[spkt.CmnHdrLen+addrLen:]
	case scmp.RawExtHdrs:
		return scnPld[:extLen]
	case scmp.RawL4Hdr:
		if s, ok := qr.l4.(*layers.SCMP); ok {
			return qr.l4.LayerContents()[:scmp.HdrLen+s.Meta.InfoLen*common.LineLen]
		}
		return qr.l4.LayerContents()
	}
	return nil
}
Statement from Service Canada on passport service delivery in the Capitale-Nationale region
QUÉBEC, July 14, 2022 /CNW/ - The Government of Canada is taking steps to help streamline the in-person application process and better manage large crowds and lineups for passport services, in particular in large urban centres, including Montreal, Québec City, Gatineau, Calgary, Edmonton, Vancouver, Surrey, Richmond and the Greater Toronto Area.
In the Capitale-Nationale region, the triage includes four groups:
• Due to the high number of status requests, it takes three or more days to process a request.
• A status request can be submitted online on Canada.ca.
• If a request has already been made, Canadians should not submit another one.Despite the weather remaining way below freezing since Christmas, I decided we needed to get into the shop and start on the project. So last night I finished planing the boards for the ring case and my eldest, Charmayne, started on learning how to make the drawers she’ll be responsible for. With temperatures remaining in the teens this morning she and I made our way back over to make some more progress. I worked on making the half blind box joints on the ring case but will need to de...
Spent time out in the shop tonight getting the ring and music box cleaned up. As I said yesterday, I really don’t like my box joints but the nice thing is they’ll be hid by the casing on the sides and the front board up front. It’s not fully complete as I have the base to build as well as the inside tray for the ring side. I also want set up the knob to shut off the music box which is not something I have done in the past so there will be some more stuff to figure out bef