_G.GetAchievementCriteriaInfo(achnum, achitem)
            WoWPro.note[i] = description.. " ("..quantityString.." of "..requiredQuantity..")\n\n"..WoWPro.note[i]
        end
    end

    -- Module ParseQuestLine Handlers --
    if WoWProDB.char.currentguide and
       WoWPro.Guides[WoWProDB.char.currentguide] and
       WoWPro.Guides[WoWProDB.char.currentguide].guidetype and
       WoWPro[WoWPro.Guides[WoWProDB.char.currentguide].guidetype].ParseQuestLine then
        WoWPro[WoWPro.Guides[WoWProDB.char.currentguide].guidetype]:ParseQuestLine(text,i)
    end
    return i
end

function WoWPro:GuideStatus()
    local text = "GuideStatus:\n"

    -- Set start/finish based on what is visible
    for i = 1,15 do
        local index = WoWPro.rows[i].index
        if WoWPro.rows[i]:IsVisible() then
            local line = WoWPro.EmitStep(index)
            line = line:gsub("||", "¦")
            text = text .. line .. "\n"
        end
    end

    return text
end

function WoWPro.ClearNpcFauxQuests(GID)
    for k, v in pairs(WoWProDB.global.NpcFauxQuests) do
        if (v.guide == nil) or (v.guide == GID) then
            WoWProDB.global.NpcFauxQuests[k] = nil
        end
    end
end

function WoWPro.ClearQID2Guide(GID)
    for k, v in pairs(WoWProCharDB.QID2Guide) do
        if v == GID then
            WoWProCharDB.QID2Guide[k] = nil
        end
    end
end

function WoWPro.RecordStuff(i)
    local QIDs = WoWPro.QID[i]
    local NPCs = WoWPro.NPC[i]
    if not QIDs then return end

    local GID = WoWProDB.char.currentguide
    local guideType = WoWPro.Guides[GID].guidetype
    local guideClass = WoWPro[guideType]
    local recordQIDs = guideClass.RecordQIDs or WoWPro.Guides[GID].AutoSwitch

    if not recordQIDs then return end

    if WoWPro.noauto[i] then
        return
    end

    if WoWPro.action[i] == "!" and NPCs then
        -- NPC triggered QID
        -- ! Brutus/Ruckus|NPC|85561;85655|QID|85561.1|
        local numNPCs = select("#", (";"):split(NPCs))
        for j=1,numNPCs do
            local npc = select(numNPCs-j+1, (";"):split(NPCs))
            local NPC = tonumber(npc)
            if NPC then
                WoWProDB.global.NpcFauxQuests[NPC] = {qid = tonumber(QIDs), title = WoWPro.step[i], guide = GID}
                -- WoWPro:Print("Recorded NPC %d => QID %s",NPC, QIDs)
            end
        end
    else
        -- Regular quest declaration
        local numQIDs = select("#", ("^&"):split(QIDs))
        if WoWPro.action[i] == "A" or WoWPro.action[i] == "C" or WoWPro.action[i] == "T" then
            for j=1,numQIDs do
                local qid = select(numQIDs-j+1, ("^&"):split(QIDs))
                local QID = tonumber(qid)
                if QID then
                    -- WoWPro:Print("Recorded QID %s to GID %s",qid,GID)
                    WoWProCha


local E, L, V, P, G = unpack(ElvUI)
local DT = E:GetModule('DataTexts')

local format, strjoin = format, strjoin

local UnitAttackPower = UnitAttackPower
local UnitRangedAttackPower = UnitRangedAttackPower
local ComputePetBonus = ComputePetBonus

local ATTACK_POWER = ATTACK_POWER
local ATTACK_POWER_MAGIC_NUMBER = ATTACK_POWER_MAGIC_NUMBER
local MELEE_ATTACK_POWER = MELEE_ATTACK_POWER
local MELEE_ATTACK_POWER_TOOLTIP = MELEE_ATTACK_POWER_TOOLTIP
local RANGED_ATTACK_POWER = RANGED_ATTACK_POWER
local RANGED_ATTACK_POWER_TOOLTIP = RANGED_ATTACK_POWER_TOOLTIP
local STAT_CATEGORY_ENHANCEMENTS = STAT_CATEGORY_ENHANCEMENTS
local PET_BONUS_TOOLTIP_SPELLDAMAGE = PET_BONUS_TOOLTIP_SPELLDAMAGE
local PET_BONUS_TOOLTIP_RANGED_ATTACK_POWER = PET_BONUS_TOOLTIP_RANGED_ATTACK_POWER

local isHunter = E.myclass == 'HUNTER'
local displayNumberString, totalAP, db = ''

local function OnEvent(self)
	local base, posBuff, negBuff = (isHunter and UnitRangedAttackPower or UnitAttackPower)('player')
	totalAP = base + posBuff + negBuff

	if db.NoLabel then
		self.text:SetFormattedText(displayNumberString, totalAP)
	else
		self.text:SetFormattedText(displayNumberString, db.Label ~= '' and db.Label or ATTACK_P


g<u32, _DCOER_CONSTK_RSEL5>;
#[allow(missing_docs)]
#[doc(hidden)]
pub struct _DCOER_CONSTK_RSEL5;
#[doc = "`read()` method returns [dcoer_constk_rsel5::R](dcoer_constk_rsel5::R) reader structure"]
impl crate::Readable for DCOER_CONSTK_RSEL5 {}
#[doc = "DCO ER mode: DCO Constant (K) for DCORSEL 5"]
pub mod dcoer_constk_rsel5;
#[doc = "ADC14 Calibration Tag\n\nThis register you can [`read`](crate::generic::Reg::read). See [API](https://docs.rs/svd2rust/#read--modify--write-api).\n\nFor information about available fields see [adc14_cal_tag](adc14_cal_tag) module"]
pub type ADC14_CAL_TAG = crate::Reg<u32, _ADC14_CAL_TAG>;
#[allow(missing_docs)]
#[doc(hidden)]
pub struct _ADC14_CAL_TAG;
#[doc = "`read()` method returns [adc14_cal_tag::R](adc14_cal_tag::R) reader structure"]
impl crate::Readable for ADC14_CAL_TAG {}
#[doc = "ADC14 Calibration Tag"]
pub mod adc14_cal_tag;
#[doc = "ADC14 Calibration Length\n\nThis register you can [`read`](crate::generic::Reg::read). See [API](https://docs.rs/svd2rust/#read--modify--write-api).\n\nFor information about available fields see [adc14_cal_len](adc14_cal_len) module"]
pub type ADC14_CAL_LEN = crate::Reg<u32, _ADC14_CAL_LEN>;
#[allow(missing_docs)]
#[doc(hidden)]
pub struct _ADC14_CAL_LEN;
#[doc = "`read()` method returns [adc14_cal_len::R](adc14_cal_len::R) reader structure"]
impl crate::Readable for ADC14_CAL_LEN {}
#[doc = "ADC14 Calibration Length"]
pub mod adc14_cal_len;
#[doc = "ADC Gain Factor\n\nThis register you can [`read`](crate::generic::Reg::read). See [API](https://docs.rs/svd2rust/#read--modify--write-api).\n\nFor information about available fields see [adc_gain_factor](adc_gain_factor) module"]
pub type ADC_GAIN_FACTOR = crate::Reg<u32, _ADC_GAIN_FACTOR>;
#[allow(missing_docs)]
#[doc(hidden)]
pub struct _ADC_GAIN_FACTOR;
#[doc = "`read()` method returns [adc_gain_factor::R](adc_gain_factor::R) reader structure"]
impl crate::Readable for ADC_GAIN_FACTOR {}
#[doc = "ADC Gain Factor"]
pub mod adc_gain_factor;
#[doc = "ADC Offset\n\nThis register you can [`read`](crate::generic::Reg::read). See [API](https://docs.rs/svd2rust/#read--modify--write-api).\n\nFor information about available fields see [adc_offset](adc_offset) module"]
pub type ADC_OFFSET = crate::Reg<u32, _ADC_OFFSET>;
#[allow(missing_docs)]
#[doc(hidden)]
pub struct _ADC_OFFSET;
#[doc = "`read()` method returns [adc_offset::R](adc_offset::R) reader structure"]
impl crate::Readable for ADC_OFFSET {}
#[doc = "ADC Offset"]
pub mod adc_offset;
#[doc = "Reserved\n\nThis register you can [`read`](crate::generic::Reg::read). See [API](https://docs.rs/svd2rust/#read--modify--write-api).\n\nFor information about available fields see [reserved11](reserved11) module"]
pub type RESERVED11


 根据预训练权重的Key和模型的Key进行加载
        #------------------------------------------------------#
        model_dict      = model.state_dict()
        pretrained_dict = torch.load(model_path, map_location = device)
        load_key, no_load_key, temp_dict = [], [], {}
        for k, v in pretrained_dict.items():
            if k in model_dict.keys() and np.shape(model_dict[k]) == np.shape(v):
                temp_dict[k] = v
                load_key.append(k)
            else:
                no_load_key.append(k)
        model_dict.update(temp_dict)
        model.load_state_dict(model_dict)
        #------------------------------------------------------#
        #   显示没有匹配上的Key
        #------------------------------------------------------#
        if local_rank == 0:
            print("\nSuccessful Load Key:", str(load_key)[:500], "……\nSuccessful Load Key Num:", len(load_key))
            print("\nFail To Load Key:", str(no_load_key)[:500], "……\nFail To Load Key num:", len(no_load_key))
            print("\n\033[1;33;44m温馨提示，head部分没有载入是正常现象，Backbone部分没有载入是错误的。\033[0m")

    #----------------------#
    #   获得损失函数
    #----------------------#
    yolo_loss = YOLOLoss(anchors, num_classes, input_shape, Cuda, anchors_mask)
    #----------------------#
    #   记录Loss
    #----------------------#
    if local_rank == 0:
        time_str        = datetime.datetime.strftime(datetime.datetime.now(),'%Y_%m_%d_%H_%M_%S')
        log_dir         = os.path.join(save_dir, "loss_" + str(time_str))
        loss_history    = LossHistory(log_dir, model, input_shape=input_shape)
    else:
        loss_history    = None

    #------------------------------------------------------------------#
    #   torch 1.2不支持amp，建议使用torch 1.7.1及以上正确使用fp16
    #   因此torch1.2这里显示"could not be resolve"
    #------------------------------------------------------------------#
    if fp16:
        from torch.cuda.amp import GradScaler as GradScaler
        scaler = GradScaler()
    else:
        scaler = None

    model_train     = model.train()
    #----------------------------#
    #   多卡同步Bn
    #----------------------------#
    if sync_bn and ngpus_per_node > 1 and distributed:
        model_train = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model_train)
    elif sync_bn:
        print("Sync_bn is not support in one gpu or not distributed.")

    if Cuda:
        if distributed:
            #----------------------------#
            #   多卡平行运行
            #----------------------------#
            model_train = model_train.cuda(local_rank)
            model_train = torch.nn.parallel.DistributedDataParallel(model_train, device_ids=[local_rank], find_unused_parameters=True)
        else:
            model_train = torch.nn.DataParallel(model)
            cudnn.benchmark = True
            model_train = model_train.cuda()

    #---------------------------#
    #   读取数据集对应的txt
    #---------------------------#
    with open(train_annotation_path) as f:
        train_lines = f.readlines()
    with open(val_annotation_path) as f:
        val_lines   = f.readlines()
    num_train   = len(train_lines)
    num_val     = len(val_lines)

    if local_rank == 0:
        show_config(
            classes_path = classes_path, anchors_path = anchors_path, anchors_mask = anchors_mask, model_path = model_path, input_shape = input_shape, \
            Init_Epoch = Init_Epoch, Freeze_Epoch = Freeze_Epoch, UnFreeze_Epoch = UnFreeze_Epoch, Freeze_batch_size = Freeze_batch_size, Unfreeze_batch_size = Unfreeze_batch_size, Freeze_Train = Freeze_Train, \
            Init_lr = Init_lr, Min_lr = Min_lr, optimizer_type = optimizer_type, momentum = momentum, lr_decay_type = lr_decay_type, \
            save_period = save_period, save_dir = save_dir, num_workers = num_workers, num_train = num_train, num_val = num_val
        )
        #---------------------------------------------------------#
        #   总训练世代指的是遍历全部数据的总次数
        #   总训练步长指的是梯度下降的总次数
        #   每个训练世代包含若干训练步长，每个训练步长进行一次梯度下降。
        #   此处仅建议最低训练世代，上不封顶，计算时只考虑了解冻部分
        #----------------------------------------------------------#
        wanted_step = 5e4 if optimizer_type == "sgd" else 1.5e4
        total_step  = num_train // Unfreeze_batch_size * UnFreeze_Epoch
        if total_step <= wanted_step:
            if num_train // Unfreeze_batch_size == 0:
                raise ValueError('数据集过小，无法进行训练，请扩充数据集。')
            wanted_epoch = wanted_step // (num_train // Unfreeze_batch_size) + 1
            p


pl)
	if sep == nil then
		return p:match(win and '[\\/]+$' or '/+$')
	else
		local p = set_endsep(type, p, win, sep, default_sep)
		return p and path.format(type, p, drive, pl) or s, p and true or false
	end
end

--detect or set a path's separator (for Windows paths only).
--NOTE: setting '\' on a UNIX path may result in an invalid path because
--`\` is a valid character in UNIX filenames!
local function set_sep(p, win, sep, default_sep, empty_names)
	local dsep = default_sep or (win and '\\' or '/')
	if sep == true then --set to default
		sep = dsep
	elseif sep == false then --set to default only if mixed
		sep = detect_sep(p, win) or dsep
	elseif sep == nil then --collapse only
		sep = '%1'
	else
		assert(sep == '\\' or sep == '/', 'invalid separator')
	end
	if empty_names then
		return p:gsub(win and '[\\/]' or '/', sep)
	else
		return p:gsub(win and '([\\/])[\\/]*' or '(/)/*', sep)
	end
end
function path.sep(s, pl, sep, default_sep, empty_names)
	local win = win(pl)
	local type, p, drive = path.parse(s, pl)
	if sep == nil and empty_names == nil then
		return detect_sep(p, win)
	else
		p = set_sep(p, win, sep, default_sep, empty_names)
		return path.format(type, p, drive, pl)
	end
end

function path.long(s, pl, long)
	local type, p, drive = path.parse(s, pl)
	local is_long = type == 'abs_long' or type == 'unc_long'
	local is_short = (win(pl) and type == 'abs') or type == 'unc'
	if long == nil then
		if is_long then
			return true
		elseif is_short then
			return false
		else
			return nil --does not apply
		end
	end
	if
		is_short and (long == true or (long == 'auto' and #s > 259))
	then
		p = p:gsub('/+', '\\') --NOTE: this might create a smaller path
		local long_type = type == 'abs' and 'abs_long' or 'unc_long'
		s = path.format(long_type, p, drive, pl)
	elseif
		is_long and (long == false or (long == 'auto' and #s <= 259 + 4))
	then
		local short_type = type == 'abs_long' and 'abs' or 'unc'
		s = path.format(short_type, p, drive, pl)
	end
	return s
end

--get the last path component of a path.
--if the path ends in a separator then the empty string is returned.
function path.file(s, pl)
	local _, p = path.parse(s, pl)
	return p:match(win(pl) and '[^\\/]*$' or '[^/]*$')
end

--get the filename without extension and the extension from a path.
function path.nameext(s, pl)
	local patt = win(pl) and '^(.-)%.([^%.\\/]*)$' or '^(.-)%.([^%./]*)$'
	local file = path.file(s, pl)
	local name, ext = file:match(patt)
	if not name or name == '' then -- 'dir' or '.bashrc'
		name, ext = file, nil
	end
	return name, ext
end

function path.ext(s, pl)
	return (select(2, path.nameext(s, pl)))
end

--get a path without basename and separator. if the path ends with


9, 1008(AX)

	// end DCT32
	VZEROUPPER
	MOVL       1020(AX), CX
	VMOVUPS    768(AX), Y0
	VMOVUPS    800(AX), Y1
	VMOVUPS    832(AX), Y2
	VMOVUPS    864(AX), Y3
	VMOVUPS    896(AX), Y8
	VADDPS     900(AX), Y8, Y4
	VUNPCKLPS  Y4, Y0, Y8
	VUNPCKHPS  Y4, Y0, Y4
	VPERM2F128 $0x02, Y8, Y4, Y0
	VMOVUPS    Y0, 768(AX)
	VPERM2F128 $0x13, Y8, Y4, Y0
	VMOVUPS    Y0, 800(AX)
	VMOVUPS    928(AX), Y8
	VADDPS     932(AX), Y8, Y4
	VUNPCKLPS  Y4, Y1, Y8
	VUNPCKHPS  Y4, Y1, Y4
	VPERM2F128 $0x02, Y8, Y4, Y0
	VMOVUPS    Y0, 832(AX)
	VPERM2F128 $0x13, Y8, Y4, Y0
	VMOVUPS    Y0, 864(AX)
	VMOVUPS    960(AX), Y8
	VADDPS     964(AX), Y8, Y4
	VUNPCKLPS  Y4, Y2, Y8
	VUNPCKHPS  Y4, Y2, Y4
	VPERM2F128 $0x02, Y8, Y4, Y0
	VMOVUPS    Y0, 896(AX)
	VPERM2F128 $0x13, Y8, Y4, Y0
	VMOVUPS    Y0, 928(AX)
	VMOVUPS    992(AX), Y8
	VPMOVZXBD  perm<>+8(SB), Y7
	VPERMPS    992(AX), Y7, Y4
	VADDPS     Y4, Y8, Y4
	VUNPCKLPS  Y4, Y3, Y8
	VUNPCKHPS  Y4, Y3, Y4
	VPERM2F128 $0x02, Y8, Y4, Y0
	VMOVUPS    Y0, 960(AX)
	VPERM2F128 $0x13, Y8, Y4, Y0
	VMOVUPS    Y0, 992(AX)
	MOVL       CX, 1020(AX)
	VZEROUPPER

	// end DCT64
	VZEROUPPER
	MOVL       1020(AX), CX
	VMOVUPS    512(AX), Y0
	VMOVUPS    768(AX), Y2
	VADDPS     772(AX), Y2, Y1
	VUNPCKLPS  Y1, Y0, Y2
	VUNPCKHPS  Y1, Y0, Y1
	VPERM2F128 $0x02, Y2, Y1, Y0
	VMOVUPS    Y0, 512(SP)
	VPERM2F128 $0x13, Y2, Y1, Y0
	VMOVUPS    Y0, 544(SP)
	VMOVUPS    544(AX), Y0
	VMOVUPS    800(AX), Y2
	VADDPS     804(AX), Y2, Y1
	VUNPCKLPS  Y1, Y0, Y2
	VUNPCKHPS  Y1, Y0, Y1
	VPERM2F128 $0x02, Y2, Y1, Y0
	VMOVUPS    Y0, 576(SP)
	VPERM2F128 $0x13, Y2, Y1, Y0
	VMOVUPS    Y0, 608(SP)
	VMOVUPS    576(AX), Y0
	VM


({modelPath:this.modelPath,modelArtifactsInfo:a}),h;u.onsuccess=()=>{h=s.transaction(Qs,"readwrite");let d=h.objectStore(Qs).put({modelPath:this.modelPath,modelArtifacts:e,modelArtifactsInfo:a});d.onsuccess=()=>r({modelArtifactsInfo:a}),d.onerror=f=>{c=l.objectStore(Oo);let m=c.delete(this.modelPath);m.onsuccess=()=>(s.close(),i(d.error)),m.onerror=x=>(s.close(),i(d.error))}},u.onerror=p=>(s.close(),i(u.error)),l.oncomplete=()=>{h==null?s.close():h.oncomplete=()=>s.close()}}},o.onerror=s=>i(o.error)})}};Si.URL_SCHEME="indexeddb://";var tA=n=>ot().getBool("IS_BROWSER")&&!Array.isArray(n)&&n.startsWith(Si.URL_SCHEME)?YU(n.slice(Si.URL_SCHEME.length)):null;Fe.registerSaveRouter(tA);Fe.registerLoadRouter(tA);function YU(n){return new Si(n)}function ZU(n){return n.startsWith(Si.URL_SCHEME)?n.slice(Si.URL_SCHEME.length):n}var o1=class{constructor(){this.indexedDB=QT()}listModels(){return Jt(this,null,function*(){return new Promise((t,e)=>{let r=this.indexedDB.open($b,Ub);r.onupgradeneeded=()=>Wb(r),r.onsuccess=()=>{let i=r.result,o=i.transaction(Oo,"readonly"),a=o.objectStore(Oo).getAll();a.onsuccess=()=>{let l={};for(let c of a.result)l[c.modelPath]=c.modelArtifactsInfo;t(l)},a.onerror=l=>(i.close(),e(a.error)),o.oncomplete=()=>i.close()},r.onerror=i=>e(r.error)})})}removeModel(t){return Jt(this,null,function*(){return t=ZU(t),new Promise((e,r)=>{let i=this.indexedDB.open($b,Ub);i.onupgradeneeded=()=>Wb(i),i.onsuccess=()=>{let o=i.result,s=o.transaction(Oo,"readwrite"),a=s.objectStore(Oo),l=a.get(t),c;l.onsuccess=()=>{if(l.result==null)return o.close(),r(new Error(`Cannot find model with path '${t}' in IndexedDB.`));{let u=a.delete(t),h=()=>{c=o.transaction(Qs,"readwrite");let d=c.objectStore(Qs).delete(t);d.onsuccess=()=>e(l.result.modelArtifactsInfo),d.onerror=f=>r(l.error)};u.onsuccess=h,u.onerror=p=>(h(),o.close(),r(l.error))}},l.onerror=u=>(o.close(),r(l.error)),s.oncomplete=()=>{c==null?o.close():c.oncomplete=()=>o.close()}},i.onerror=o=>r(i.error)})})}};var eo="/",$l="tensorflowjs_models",eA="info",JU="model_topology",QU="weight_specs",tW="weight_data",eW="model_metadata";function nA(n){return{info:[$l,n,eA].join(eo),topology:[$l,n,JU].join(eo),weightSpecs:[$l,n,QU].join(eo),weightData:[$l,n,tW].join(eo),modelMetadata:[$l,n,eW].join(eo)}}function nW(n){let t=n.split(eo);if(t.length<3)throw new Error(`Invalid key format: ${n}`);return t.slice(1,t.length-1).join(eo)}function rW(n){return n.startsWith(Ci.URL_SCHEME)?n.slice(Ci.URL_SCHEME.length):n}var Ci=class{constructor(t){if(!ot().getBool("IS_BROWSER")||typeof window=="undefined"||typeof window.localStorage=="undefined")throw new Error("The curren


.37.21.3.39.6.59.89.28.43.58.86.83 1.28.2.32.35.64.51.97.21.4.44.78.62 1.16.16.34.27.68.41 1.01.15.35.32.72.44 1.07.12.36.2.71.29 1.07.09.32.21.66.27.99.09.39.11.77.15 1.16.04.28.09.56.11.84.02.45 0 .87-.03 1.31-.01.21.01.42-.01.63-.07.63-.18 1.26-.35 1.89a11.4 11.4 0 0 1-.66 1.8c0 .01-.01.02-.03.04-.09.2-.22.37-.32.57-.2.36-.38.74-.62 1.09-.01.02-.04.05-.07.07-.15.22-.34.43-.51.64-.23.29-.44.58-.69.86-.04.04-.08.07-.12.12-.21.22-.44.43-.68.64-.25.24-.49.49-.76.72-.05.05-.13.09-.18.14-.26.22-.55.41-.81.61-.28.2-.52.42-.81.61l-.26.16c-.3.2-.64.39-.96.58-.29.18-.56.36-.86.52-.11.06-.23.11-.36.17-.35.18-.73.36-1.1.53-.31.14-.58.3-.9.44-.15.07-.32.12-.46.18-.39.17-.81.33-1.22.48-.3.12-.6.25-.91.37-.18.06-.39.12-.58.19-.17.06-.32.13-.49.18l-.03-.02c-.25.09-.51.17-.76.24-.33.1-.64.22-.98.32-.71.21-1.48.4-2.23.59-.29.07-.55.15-.84.22-.79.19-1.61.36-2.45.52-.29.06-.56.13-.86.19-.92.18-1.88.33-2.85.48-.23.03-.44.08-.67.11-1.03.16-2.11.29-3.21.42-.18.02-.34.04-.53.07-1.15.13-2.33.23-3.52.34-.14.01-.26.03-.4.04-1.2.09-2.42.17-3.68.24l-.46.03c-1.31.07-2.65.11-4.02.14-.1 0-.2.01-.29.01-1.43.03-2.9.04-4.38.05h-.1c-22.95-.08-52.32-4.36-83.48-12.95-51.67-14.24-93.02-36.13-106.23-54.49h-.01c-.02-.04-.04-.06-.07-.1-.14-.2-.27-.4-.4-.6-.33-.49-.66-.98-.96-1.47-.16-.26-.29-.51-.44-.77-.18-.4-.41-.82-.61-1.25m311.22-56.94c5.15-35.2-54.67-78.6-142.21-102.73S74.02 234.12 61.4 263.8m342.59-111.98 25.44 13.33" class="st6"/><ellipse cx="441.14" cy="171.75" class="st6" rx="13.45" ry="13.46" transform="rotate(-83.748 441.117 171.737)"/><path d="m153.63 78.26-28.61-2.55" class="st6"/><ellipse cx="111.61" cy="74.93" class="st6" rx="13.45" ry="13.46" transform="rotate(-83.748 111.601 74.928)"/><path d="M263.5 167.08 205.01 365.9m157.43 106.57 28.52-211.22c8.37-30.34-50.62-73.07-131.78-95.45s-153.74-15.91-162.11 14.44L13.22 376.19l-2.61 6.57C.63 418.93 70.7 469.65 167.82 496.41c97.1 26.76 183.92 19.14 193.9-17


on Methods

        /// <summary>
        /// Execute passed redirect result
        /// </summary>
        /// <param name="context">Action context</param>
        /// <param name="result">Redirect result</param>
        public override Task ExecuteAsync(ActionContext context, RedirectResult result)
        {
            if (result == null)
                throw new ArgumentNullException(nameof(result));

            if (_securitySettings.AllowNonAsciiCharInHeaders)
            {
                //passed redirect URL may contain non-ASCII characters, that are not allowed now (see https://github.com/aspnet/KestrelHttpServer/issues/1144)
                //so we force to encode this URL before processing
                result.Url = Uri.EscapeUriString(WebUtility.UrlDecode(result.Url));
            }

            return base.ExecuteAsync(context, result);
        }

        #endregion
    }
}


or: #bcbfbf;
  display: flex;
  height: 1.6rem;
  max-height: 1.6rem;
  min-height: 1.6rem;
  width: 100%;
}
.stringeditor .sm-input-dark-large {
  border-radius: 6px;
  border-color: #263238;
  border-style: solid;
  background-color: #12181b;
  padding: 0.24rem;
  color: #bcbfbf;
  display: flex;
  width: 100%;
  height: 1.6rem;
  max-height: 1.6rem;
  min-height: 1.6rem;
}
.stringeditor .sm-input-dark-large img {
  max-width: 6rem;
  max-height: 4.6rem;
  object-fit: contain;
  border-style: none !important;
}
.stringeditor .sm-input-dark-large-image {
  border-radius: 6px;
  border-color: transparent;
  border-style: solid;
  background-color: #12181b;
  color: #bcbfbf;
  display: flex;
  width: 100%;
}
.stringeditor .sm-input-dark-large-image img {
  max-width: 6rem;
  max-height: 4.6rem;
  object-fit: contain;
  border-style: none !important;
}
.stringeditor .p-inputnumber-input {
  color: #bcbfbf;
}
.stringeditor .label {
  color: #bcbfbf;
}
.stringeditor:focus-visible {
  background-color: #12181b;
}
.stringeditor .p-float-label > label {
  height: 1.6rem;
  left: 0.24rem;
  padding-top: 0.15rem !important;
}
.stringeditor .input-icon {
  position: absolute;
  right: 0.24rem;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}
.stringeditor .input-icon-left {
  position: absolute;
  left: 0.25rem;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

.numeric-field {
  font-family: "Courier New", Courier, monospace;
  font-weight: bold;
}

.text-default-color {
  color: #bcbfbf;
}

.text-container, .stringeditor .sm-input, .stringeditor .sm-input-dark, .stringeditor .sm-input-dark-header, .stringeditor .sm-input-dark-header-large, .stringeditor .sm-input-dark-large, .stringeditor .sm-input-dark-large-image {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: normal;
}

.sm-standard-text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  padding-left: 0.1rem !important;
  padding-top: 0.1rem !important;
  padding-bottom: 0.1rem !important;
  font-size: 0.75rem;
  height: 1.6rem;
}

.no-text {
  color: transparent;
}

:root {
  font-family: Poppins, sans-serif;
  --font-family: Poppins,
      sans-serif;
  --surface-a: #161d21;
  --surface-b: #0e1315;
  --surface-d: #263238;
  --surface-e: #161d21;
  --surface-f: #161d21;
  --text-color: #bcbfbf;
  --text-color-secondary: rgba(255, 255, 255, 0.6);
  --primary-color: #bcbf


	},
	"21/96": {
    "name": "Sixteenth tone"
  },
  "1728/1715": {
    "name": "Orwell comma"
  },
  "126/125": {
    "name": "Small septimal semicomma",
    "alternateNames": [
      "Small septimal comma",
      "Starling comma"
    ]
  },
  "121/120": {
    "name": "Undecimal seconds comma"
  },
  "2048/2025": {
    "name": "Diaschisma",
    "alternateNames": [
      "Minor comma"
    ]
  },
	"81/80": {
		"name": "Syntonic comma",
		"alternateNames": [
			"Major comma",
			"Chromatic diesis",
			"Comma of Didymus"
		]
	},
	"531441/524288": {
		"name": "Pythagorean comma",
		"alternateNames": [
			"Ditonic comma"
		]
	},
  "64/63": {
    "name": "Septimal comma",
    "alternateNames": [
      "Archytas' comma",
      "63rd subharmonic"
    ]
  },
  "56/55": {
    "name": "Undecimal diesis",
    "alternateNames": [
      "Ptolemy's enharmonic"
    ]
  },
  "21/36": {
    "name": "Sixth tone"
  },
  "50/49": {
    "name": "Jubilisma",
    "alternateNames": [
			"Septimal sixth tone",
      "Erlich's decatonic comma",
      "Tritonic diesis"
    ]
  },
  "49/48": {
    "name": "Septimal diesis",
    "alternateNames": [
      "Slendro diesis",
      "Septimal 1/6-tone"
    ]
  },
  "46/45": {
    "name": "Inferior quarter tone"
  },
  "45/44": {
    "name": "Undecimal diesis",
    "alternateNames": [
      "Undecimal fifth tone"
    ]
  },
  "21/30": {
    "name": "Fifth tone"
  },
	"128/125": {
		"name": "Enharmonic diesis",
		"alternateNames": [
			"Enharmonic diesis",
			"Minor diesis",
			"Diminished second"
		]
	},
	"25/24": {
		"name": "Augmented unison",
		"short": "A1",
		"alternateNames": [
			"Minor chromatic semitone",
			"Minor semitone",
			"Small semitone"
		]
	},
	"39/38": {
    "name": "Superior quarter-tone",
    "alternateNames": [
      "Novendecimal fifth tone"
    ]
  },
  "36/35": {
    "name": "Septimal quarter tone",
    "alternateNames": [
      "Septimal diesis",
      "Septimal chroma",
      "Superior quarter tone"
    ]
  },
  "246/239": {
    "name": "Just quarter tone"
  },
  "31/30": {
    "name": "Greater quarter-tone",
  },
  "28/27": {
    "name": "Septimal minor second",
    "alternateNames": [
      "Small minor second",
      "Inferior quarter tone"
    ]
  },
  "27/26": {
    "name": "Chromatic diesis",
    "alternateNames": [
      "Tridecimal comma"
    ]
  },
  "21/18": {
    "name": "Third tone"
  },
  "26/25": {
    "name": "Tridecimal third tone",
    "alterna


          {
                menu_redraw_blocked = 1;
                info_edit_handlers[info_edit_mode](FLEXINFO_EDIT_CYCLIC, 0);
            }

            /* in any case redraw */
            info_menu_draw_editscreen(info_config);
            msleep(20);
        }
        else
        {
            /* no edit mode etc active, reset all variables */
            info_edit_mode = 0;
            menu_redraw_blocked = 0;
            info_movestate = 0;

            msleep(500);
        }
    }
}

TASK_CREATE( "info_edit_task", info_edit_task, 0, 0x16, 0x1000 );

#endif // FLEXINFO_DEVELOPER_MENU

static void info_init()
{
    info_sem = create_named_semaphore("flexinfo_sem", SEM_CREATE_UNLOCKED);

    /* init the pre-configured lists */
    for(int pos = 0; pos < COUNT(info_config_photo); pos++)
    {
        info_config_photo[pos].hdr.status = INFO_STATUS_USED;
        info_config_photo[pos].hdr.config = info_config_photo;
        info_config_photo[pos].hdr.config_pos = pos;
    }
    for(int pos = 0; pos < COUNT(info_config_liveview); pos++)
    {
        info_config_liveview[pos].hdr.status = INFO_STATUS_USED;
        info_config_liveview[pos].hdr.config = info_config_liveview;
        info_config_liveview[pos].hdr.config_pos = pos;
    }

    /* init dynamic list */
    for(int pos = 0; pos < FLEXINFO_DYNAMIC_ENTRIES; pos++)
    {
        info_config_dynamic[pos].hdr.status = INFO_STATUS_FREE;
        info_config_dynamic[pos].hdr.config = info_config_dynamic;
        info_config_dynamic[pos].hdr.config_pos = pos;
    }

    /* add start/stop entries */
    info_config_dynamic[0].type = INFO_TYPE_CONFIG;
    info_config_dynamic[0].hdr.status = INFO_STATUS_USED;
    info_config_dynamic[2].type = INFO_TYPE_END;
    info_config_dynamic[2].hdr.status = INFO_STATUS_USED;

#ifdef FLEXINFO_DEVELOPER_MENU
    menu_add( "Prefs", info_menus, COUNT(info_menus) );
#endif

#ifdef FLEXINFO_XML_CONFIG
    info_load_config(FLEXINFO_DEFAULT_FILENAME);
#endif
}

info_elem_t *info_add_item()
{
    info_elem_t *item = NULL;

    take_semaphore(info_sem, 0);
    for(int pos = 1; pos < FLEXINFO_DYNAMIC_ENTRIES - 2; pos++)
    {
        if(info_config_dynamic[pos].hdr.status == INFO_STATUS_FREE)
        {
            /* this empty entry will be the returned one. set it to CONFIG type so it wont get handled */
            item = &info_config_dynamic[pos];
            item->type = INFO_TYPE_CONFIG;
            item->hdr.status = INFO_STATUS_USED;
            item->hdr.config = info_config_dynamic;
            item->hdr.config_pos = pos;

            /* next entry is empty (and most likely a TYPE_END entry) */
            info_config_dynamic[pos + 1].hdr.status = INFO_STATUS_FREE;

            /* the one after the empty is the new TYPE_END */
            info_config_dynamic[pos + 2].type = INFO_TYPE_END;
            info_config_dynamic[pos + 2].hdr.status = INFO_STATUS_USED;

            break;
        }
    }
    give_semaphore(info_sem);

    return item;
}

void info_free_item(info_elem_t *item)
{
    take_semaphore(info_sem, 0);

    /* call deinit function first */
    if(item->type == INFO_TYPE_DYNAMIC && item->dynamic.deinit)
    {
        item->dynamic.deinit(item);
    }

    item->hdr.status = INFO_STATUS_FREE;
    give_semaphore(info_sem);
}

INIT_FUNC("info_init", info_init);

#endif // FEATURE_FLEXINFO


 srcChar int, msg ...string) Event {
	if len(msg) == 0 {
		panic("no msg provided")
	}
	var sb strings.Builder
	for _, v := range msg {
		sb.WriteString(v)
	}
	return c.NewEvent(sb.String(), typ, srcChar)
}

func (c *Ctrl) NewEvent(msg string, typ Source, srcChar int) Event {
	e := &LogEvent{
		Msg:       msg,
		Frame:     *c.f,
		Ended:     *c.f,
		Event:     typ,
		CharIndex: srcChar,
		Logs:      make(map[string]any), //+5 from default just in case we need to add in more keys
		Ordering:  make(map[string]int),
	}
	// c.events = append(c.events, e)
	c.events[c.count] = e
	c.count++
	return e
}
// Code generated by "pipeline"; DO NOT EDIT.
package attacks

const (
	ICDGroupGeneratedStart ICDGroup = iota + EndDefaultICDGroups + 1
	ICDGroupAlhaithamProjectionAttack
	ICDGroupAlhaithamExtraAttack
	ICDGroupAmber
	ICDGroupArlecchinoElementalArt
	ICDGroupAyakaExtraAttack
	ICDGroupBaizhuC2
	ICDGroupCharlotteMark
	ICDGroupCharlotteKamera
	ICDGroupChascaShining
	ICDGroupChascaShadowhunt
	ICDGroupChascaTap
	ICDGroupChascaBurst
	ICDGroupChevreuseBurstMines
	ICDGroupChioriSkill
	ICDGroupCitlaliFrostfallStorm
	ICDGroupClorindeElementalArt
	ICDGroupColleiBurst
	ICDGroupCynoBolt
	ICDGroupDiluc
	ICDGroupDoriBurst
	ICDGroupEmilieLumidouce
	ICDGroupEscoffierSkill
	ICDGroupFischl
	ICDGroupFurinaSalonSolitaire
	ICDGroupKinichLoopShot
	ICDGroupKinichScalespikerCannon
	ICDGroupLanyanRingAttack
	ICDGroupLanyanRingAttackMix
	ICDGroupLayla
	ICDGroupLyneyExtra
	ICDGroupMizukiSkill
	ICDGroupNahidaSkill
	ICDGroupNaviaBurst
	ICDGroupNilou
	ICDGroupOroronElementalBurst
	ICDGroupSigewinne
	ICDGroupSigewinneBurst
	ICDGroupTighnari
	ICDGroupVenti
	ICDGroupWandererC6
	ICDGroupWandererA4
	ICDGroupXiaoDash
	ICDGroupYaeCharged
	ICDGroupYaoyaoRadishSkill
	ICDGroupYaoyaoRadishBurst
	ICDGroupYelanBreakthrough
	ICDGroupYelanBurst
	ICDGroupLength
)

func init() {
	ICDGroupResetTimer[ICDGroupAlhaithamProjectionAttack] = 720
	ICDGroupEleApplicationSequence[ICDGroupAlhaithamProjectionAttack] = []float64{1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0}
	ICDGroupDamageSequence[ICDGroupAlhaithamProjectionAttack] = []float64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}

	ICDGroupResetTimer[ICDGroupAlhaithamExtraAttack] = 120
	ICDGroupEleApplicationSequence[ICDGroupAlhaithamExtraAttack] = []float64{1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
	ICDGroupDamageSequence[ICDGroupAlhaithamExtraAttack] = []float64{1, 1


sband = wiphy->bands[band];
		if (!sband)
			continue;

		for (i = 0; i < sband->n_channels; i++) {
			ch = &sband->channels[i];

			if (ch->flags &
			    (IEEE80211_CHAN_DISABLED | IEEE80211_CHAN_RADAR))
				continue;

			if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
				rule = freq_reg_info(wiphy,
						     MHZ_TO_KHZ(ch->center_freq));
				if (IS_ERR(rule))
					continue;

				if (!(rule->flags & NL80211_RRF_NO_IR))
					ch->flags &= ~IEEE80211_CHAN_NO_IR;
			} else if (ch->beacon_found) {
				ch->flags &= ~IEEE80211_CHAN_NO_IR;
			}
		}
	}
}

static void brcms_reg_notifier(struct wiphy *wiphy,
			       struct regulatory_request *request)
{
	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
	struct brcms_info *wl = hw->priv;
	struct brcms_c_info *wlc = wl->wlc;
	struct ieee80211_supported_band *sband;
	struct ieee80211_channel *ch;
	int band, i;
	bool ch_found = false;

	brcms_reg_apply_radar_flags(wiphy);

	if (request->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
		brcms_reg_apply_beaconing_flags(wiphy, request->initiator);

	/* Disable radio if all channels disallowed by regulatory */
	for (band = 0; !ch_found && band < NUM_NL80211_BANDS; band++) {
		sband = wiphy->bands[band];
		if (!sband)
			continue;

		for (i = 0; !ch_found && i < sband->n_channels; i++) {
			ch = &sband->channels[i];

			if (!(ch->flags & IEEE80211_CHAN_DISABLED))
				ch_found = true;
		}
	}

	if (ch_found) {
		mboolclr(wlc->pub->radio_disabled, WL_RADIO_COUNTRY_DISABLE);
	} else {
		mboolset(wlc->pub->radio_disabled, WL_RADIO_COUNTRY_DISABLE);
		brcms_err(wlc->hw->d11core,
			  "wl%d: %s: no valid channel for \"%s\"\n",
			  wlc->pub->unit, __func__, request->alpha2);
	}

	if (wlc->pub->_nbands > 1 || wlc->band->bandtype == BRCM_BAND_2G)
		wlc_phy_chanspec_ch14_widefilter_set(wlc->band->pi,
					brcms_c_japan_ccode(request->alpha2));
}

void brcms_c_regd_init(struct brcms_c_info *wlc)
{
	struct wiphy *wiphy = wlc->wiphy;
	const struct brcms_regd *regd = wlc->cmi->world_regd;
	struct ieee80211_supported_band *sband;
	struct ieee80211_channel *ch;
	struct brcms_chanvec sup_chan;
	struct brcms_band *band;
	int band_idx, i;

	/* Disable any channels not supported by the phy */
	for (band_idx = 0; band_idx < wlc->pub->_nbands; band_idx++) {
		band = wlc->bandstate[band_idx];

		wlc_phy_chanspec_band_validch(band->pi, band->bandtype,
					      &sup_chan);

		if (band_idx == BAND_2G_INDEX)
			sband = wiphy->bands[NL80211_BAND_2GHZ];
		else
			sband = wiphy->bands[NL80211_BAND_5GHZ];

		for (i = 0; i < sband->n_channels; i++) {
			ch = &sband->channels[i];
			if (!isset(sup_chan.vec, ch->hw_value))
				ch->flags |= IEEE80211_CHAN_DISABLED;
		}
	}

	wlc->wiphy->reg_notifier = brcms_reg_notifier;
	wlc->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
					REGULATORY_STRICT_REG;
	wiphy_apply_custom_regulatory(wlc->wiphy, regd->regdomain);
	brcms_reg_apply_beaconing_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER);
}


      timeEt.text = data!!.time
            detailEt.setText(data!!.detail)
        } else {
            titleEt.setText("")
            timeEt.text = "点击设置时间"
            detailEt.setText("")
        }
    }

    override fun dismiss() {
        super.dismiss()
        data = null
    }

    fun setData(response: TodoResponse) {
        data = response
    }

    @SuppressLint("SetTextI18n")
    private fun openCalender(context: Context, textView: TextView) {
        val calendar = Calendar.getInstance()
        val datePickerDialog = DatePickerDialog(
            context,
            null,
            calendar[Calendar.YEAR],
            calendar[Calendar.MONTH],
            calendar[Calendar.DAY_OF_MONTH]
        )
        datePickerDialog.show()

        // 确认按钮
        datePickerDialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener {
            // 确认年月日
            val year = datePickerDialog.datePicker.year;
            val monthOfYear = datePickerDialog.datePicker.month + 1;
            val dayOfMonth = datePickerDialog.datePicker.dayOfMonth;
            textView.text = "$year.$monthOfYear.$dayOfMonth"
            // 关闭dialog
            datePickerDialog.dismiss()
        }
    }

    private var addTodoListener: ((title: String, detail: String, time: String) -> Unit)? = null
    private var updateTodoListener: ((id: String, title: String, detail: String, time: String) -> Unit)? =
        null

    fun setAddTodoListener(listener: (title: String, detail: String, time: String) -> Unit) {
        addTodoListener = listener
    }

    fun setUpdateListener(listener: (id: String, title: String, detail: String, time: String) -> Unit) {
        updateTodoListener = listener
    }
}/*
 * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * The Universal Permissive License (UPL), Version 1.0
 *
 * Subject to the condition set forth below, permission is hereby granted to any
 * person obtaining a copy of this software, associated documentation and/or
 * data (collectively the "Software"), free of charge and under any and all
 * copyright rights in the Software, and any and all patent rights owned or
 * freely licensable by each licensor hereunder covering either (i) the
 * unmodified Software as contributed to or provided by such licensor, or (ii)
 * the Larger Works (as defined below), to deal in both
 *
 * (a) the Software, and
 *
 * (b) any piece of software and/or hardware listed in the lrgrwrks.txt file if
 * one is included with the Software each a "Larger Work" to which the Software
 * is contributed by such licensors),
 *
 * without restriction, including without limitation the rights to copy, create
 * derivative works of, display, perform, and distribute the Software and make,
 * use, sell, offer for sale, import, export, have made, and have sold the
 * Software and the Larger Work(s), and to sublicense the foregoing rights on
 * either these or other terms.
 *
 * This license is subject to the following condition:
 *
 * The above copyright notice and either this complete permission notice or at a
 * minimum a reference to the UPL must be included in all copies or substantial
 * portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

import org


func TestDebugf(t *testing.T) {
	o := newTestOutput()
	l := New(Config{Output: o}).(*logger)
	l.Debugf("test %d", 1, F{"foo": "bar"})
	last := <-o.w
	assert.Contains(t, last["file"], "log_test.go:")
	delete(last, "file")
	assert.Equal(t, map[string]interface{}{"time": fakeNow, "level": "debug", "message": "test 1", "foo": "bar"}, last)
}

func TestInfo(t *testing.T) {
	o := newTestOutput()
	l := New(Config{Output: o}).(*logger)
	l.Info("test", F{"foo": "bar"})
	last := <-o.w
	assert.Contains(t, last["file"], "log_test.go:")
	delete(last, "file")
	assert.Equal(t, map[string]interface{}{"time": fakeNow, "level": "info", "message": "test", "foo": "bar"}, last)
}

func TestInfof(t *testing.T) {
	o := newTestOutput()
	l := New(Config{Output: o}).(*logger)
	l.Infof("test %d", 1, F{"foo": "bar"})
	last := <-o.w
	assert.Contains(t, last["file"], "log_test.go:")
	delete(last, "file")
	assert.Equal(t, map[string]interface{}{"time": fakeNow, "level": "info", "message": "test 1", "foo": "bar"}, last)
}

func TestWarn(t *testing.T) {
	o := newTestOutput()
	l := New(Config{Output: o}).(*logger)
	l.Warn("test", F{"foo": "bar"})
	last := <-o.w
	assert.Contains(t, last["file"], "log_test.go:")
	delete(last, "file")
	assert.Equal(t, map[string]interface{}{"time": fakeNow, "level": "warn", "message": "test", "foo": "bar"}, last)
}

func TestWarnf(t *testing.T) {
	o := newTestOutput()
	l := New(Config{Output: o}).(*logger)
	l.Warnf("test %d", 1, F{"foo": "bar"})
	last := <-o.w
	assert.Contains(t, last["file"], "log_test.go:")
	delete(last, "file")
	assert.Equal(t, map[string]interface{}{"time": fakeNow, "level": "warn", "message": "test 1", "foo": "bar"}, last)
}

func TestError(t *testing.T) {
	o := newTestOutput()
	l := New(Config{Output: o}).(*logger)
	l.Error("test", F{"foo": "bar"})
	last := <-o.w
	assert.Contains(t, last["file"], "log_test.go:")
	delete(last, "file")
	assert.Equal(t, map[string]interface{}{"time": fakeNow, "level": "error", "message": "test", "foo": "bar"}, last)
}

func TestErrorf(t *testing.T) {
	o := newTestOutput()
	l := New(Config{Output: o}).(*logger)
	l.Errorf("test %d%v", 1, F{"foo": "bar"})
	last := <-o.w
	assert.Contains(t, last["file"], "log_test.go:")
	delete(last, "file")
	assert.Equal(t, map[string]interface{}{"time": fakeNow, "level": "error", "message": "test 1", "foo": "bar"}, last)
}

func TestFatal(t *testing.T) {
	e := exit1
	exited := 0
	exit1 = func() { exited++ }
	defer func() { exit1 = e }()
	o := newTestOutput()
	l := New(


c-.6 1.4 21 21 21 21l.1 12.9s-21.7 19.8-21.1 21.2l9.5 20c.6 1.4 29.5.5 29.5.5l9.4 9.3s-.2 31.8 1.2 32.3l20.1 8.3c1.4.6 20.7-23.5 20.7-23.5l13.1.2s20.5 23.8 21.8 23.3l20-7.5c1.4-.6-.2-32.1-.2-32.1l9.1-9.1s29.2.9 29.7-.5l8.1-19.8c.7-1.1-20.9-20.7-20.9-20.7zm-44.9-8.7c.7 17.1-12.8 31.6-30.1 32.4-17.3.8-32.1-12.5-32.8-29.6-.7-17.1 12.8-31.6 30.1-32.3 17.3-.8 32.1 12.5 32.8 29.5zm201.2-37.9l-97-97-.1.1c-75.1-73.3-195.4-72.8-269.8 1.6-50.9 51-27.8 27.9-95.7 95.3-22.3 22.3-22.3 58.7 0 81 69.9 69.4 46.4 46 97.4 97l.1-.1c75.1 73.3 195.4 72.9 269.8-1.6 51-50.9 27.9-27.9 95.3-95.3 22.3-22.3 22.3-58.7 0-81zM140.4 363.8c-59.6-59.5-59.6-156 0-215.5 59.5-59.6 156-59.5 215.6 0 59.5 59.5 59.6 156 0 215.6-59.6 59.5-156 59.4-215.6-.1z"]
};
const faUssunnah = {
  prefix: 'fab',
  iconName: 'ussunnah',
  icon: [482, 512, [], "f407", "M481.9 268.1A240.9 240.9 0 1 1 .1 268a240.9 240.9 0 1 1 481.9 0zM24.5 268a216.5 216.5 0 1 0 432.9 0A216.5 216.5 0 1 0 24.5 268zm385.9 63.3c-12.7 0-21.6-1.9-26.7-5.9c-5.5-4.3-8.2-12.3-8.2-23.8V205.1c0-6.5-5.2-20.2-15.7-41.2c7 0 17-9.1 30-27.2V284.5c0 11 2.4 19.4 7 25.3c3.7 4.7 10.1 8.9 19 12.6c1.2 .4 2.6 .9 4.1 1.4c2.9 .9 6.3 2.1 10.3 3.5c-1.8 2.7-8.3 4-19.9 4zm-219 0c-1.3 2.4-3.6 5.5-6.8 9.4l-18.5 22.5c-1-6.1-4-13-9.3-20.6s-9.7-11.4-13.4-11.4h-8.3H53.6c3.3-5.3 4.9-8.8 4.9-10.8c0-2-.8-5.3-2.4-9.7c-1.5-4.4-2.4-8.5-2.4-12.4c0-7.4 2.1-


re input[type=radio]{box-sizing:border-box;padding:0}.pure input[type=number]::-webkit-inner-spin-button,.pure input[type=number]::-webkit-outer-spin-button{height:auto}.pure input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}.pure input[type=search]::-webkit-search-cancel-button,.pure input[type=search]::-webkit-search-decoration{-webkit-appearance:none}.pure fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}.pure legend{border:0;padding:0}.pure textarea{overflow:auto}.pure optgroup{font-weight:700}.pure table{border-collapse:collapse;border-spacing:0}.pure td,.pure th{padding:0}.pure .hidden,.pure [hidden]{display:none!important}.pure .pure-img{max-width:100%;height:auto;display:block}/*!
Pure v0.6.0
Copyright 2014 Yahoo! Inc. All rights reserved.
Licensed under the BSD License.
https://github.com/yahoo/pure/blob/master/LICENSE.md
*/
.pure-table{border-collapse:collapse;border-spacing:0;empty-cells:show;border:1px solid #cbcbcb}.pure-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.pure-table td,.pure-table th{border-left:1px solid #cbcbcb;border-width:0 0 0 1px;font-size:inherit;margin:0;overflow:visible;padding:.5em 1em}.pure-table td:first-child,.pure-table th:first-child{border-left-width:0}.pure-table thead{background-color:#e0e0e0;color:#000;text-align:left;vertical-align:bottom}.pure-table td{background-color:transparent}.pure-table-odd td{background-color:#f2f2f2}.pure-table-striped tr:nth-child(2n-1) td{background-color:#f2f2f2}.pure-table-bordered td{border-bottom:1px solid #cbcbcb}.pure-table-bordered tbody>tr:last-child>td{border-bottom-width:0}.pure-table-horizontal td,.pure-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #cbcbcb}.pure-table-horizontal tbody>tr:last-child>td{border-bottom-width:0}/*!
Pure v0.6.0
Copyright 2014 Yahoo! Inc. All rights reserved.
Licensed under the BSD License.
https://github.com/yahoo/pure/blob/master/LICENSE.md
*/
.pure-u-1,.pure-u-1-1,.pure-u-1-2,.pure-u-1-3,.pure-u-2-3,.pure-u-1-4,.pure-u-3-4,.pure-u-1-5,.pure-u-2-5,.pure-u-3-5,.pure-u-4-5,.pure-u-5-5,.pure-u-1-6,.pure-u-5-6,.pure-u-1-8,.pure-u-3-8,.pure-u-5-8,.pure-u-7-8,.pure-u-1-12,.pure-u-5-12,.pure-u-7-12,.pure-u-11-12,.pure-u-1-24,.pure-u-2-24,.pure-u-3-24,.pure-u-4-24,.pure-u-5-24,.pure-u-6-24,.pure-u-7-24,.pure-u-8-24,.pure-u-9-24,.pure-u-10-24,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24{display:inline-block;*display:inline;zoom:1;letter-spacing:normal;word


as invalid. Protocol mandate
	 * the DSU be accurate or not reported.
	 */
	spin_lock(&objlay->lock);
	if (objlay->delta_space_valid != OBJ_DSU_INVALID) {
		objlay->delta_space_valid = OBJ_DSU_VALID;
		objlay->delta_space_used += space_used;
	}
	spin_unlock(&objlay->lock);
}

extern void objlayout_read_done(struct objlayout_io_res *oir,
				ssize_t status, bool sync);
extern void objlayout_write_done(struct objlayout_io_res *oir,
				 ssize_t status, bool sync);

extern int objlayout_get_deviceinfo(struct pnfs_layout_hdr *pnfslay,
	struct nfs4_deviceid *d_id, struct pnfs_osd_deviceaddr **deviceaddr,
	gfp_t gfp_flags);
extern void objlayout_put_deviceinfo(struct pnfs_osd_deviceaddr *deviceaddr);

/*
 * exported generic objects function vectors
 */

extern struct pnfs_layout_hdr *objlayout_alloc_layout_hdr(struct inode *, gfp_t gfp_flags);
extern void objlayout_free_layout_hdr(struct pnfs_layout_hdr *);

extern struct pnfs_layout_segment *objlayout_alloc_lseg(
	struct pnfs_layout_hdr *,
	struct nfs4_layoutget_res *,
	gfp_t gfp_flags);
extern void objlayout_free_lseg(struct pnfs_layout_segment *);

extern enum pnfs_try_status objlayout_read_pagelist(
	struct nfs_read_data *);

extern enum pnfs_try_status objlayout_write_pagelist(
	struct nfs_write_data *,
	int how);

extern void objlayout_encode_layoutcommit(
	struct pnfs_layout_hdr *,
	struct xdr_stream *,
	const struct nfs4_layoutcommit_args *);

extern void objlayout_encode_layoutreturn(
	struct pnfs_layout_hdr *,
	struct xdr_stream *,
	const struct nfs4_layoutreturn_args *);

extern int objlayout_autologin(struct pnfs_osd_deviceaddr *deviceaddr);

#endif /* _OBJLAYOUT_H */


8"), 0
    )
    dshape = (env.BATCH, net.c, net.h, net.w)
    dtype = "float32"

    # 测试构建开始时间
    build_start = time.time()

    # 开始前端编译
    mod, params = relay.frontend.from_darknet(net, dtype=dtype, shape=dshape)

    if target.device_name == "vta":
        # 在 Relay 中执行量化
        # 注意：将 opt_level 设置为 3，折叠 batch norm
        with tvm.transform.PassContext(opt_level=3):
            with relay.quantize.qconfig(
                global_scale=23.0,
                skip_conv_layers=[0],
                store_lowbit_output=True,
                round_for_shift=True,
            ):
                mod = relay.quantize.quantize(mod, params=params)
            # 对 VTA target 进行计算图打包和常量折叠
            mod = graph_pack(
                mod["main"],
                env.BATCH,
                env.BLOCK_OUT,
                env.WGT_WIDTH,
                start_name=pack_dict[MODEL_NAME][0],
                stop_name=pack_dict[MODEL_NAME][1],
                start_name_idx=pack_dict[MODEL_NAME][2],
                stop_name_idx=pack_dict[MODEL_NAME][3],
            )
    else:
        mod = mod["main"]

    # 在禁用 AlterOpLayout 的情况下，编译 Relay 程序
    with vta.build_config(disabled_pass={"AlterOpLayout", "tir.CommonSubexprElimTIR"}):
        lib = relay.build(
            mod, target=tvm.target.Target(target, host=env.target_host), params=params
        )

    # 测试 Relay 构建时间
    build_time = time.time() - build_start
    print(MODEL_NAME + " inference graph built in {0:.2f}s!".format(build_time))

    # 将推理库发送到远程 RPC 服务器
    temp = utils.tempdir()
    lib.export_library(temp.relpath("graphlib.tar"))
    remote.upload(temp.relpath("graphlib.tar"))
    lib = remote.load_module("graphlib.tar")

    # 图执行器
    m = graph_executor.GraphModule(lib["default"](ctx))
```

输出结果：

``` bash
/workspace/python/tvm/driver/build_module.py:267: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  "target_host parameter is going to be deprecated. "
/workspace/python/tvm/relay/build_module.py:411: DeprecationWarning: Please use input parameter mod (tvm.IRModule) instead of deprecated parameter mod (tvm.relay.function.Function)
  DeprecationWarning,
yolov3-tiny inference graph built in 16.12s!
```

## 执行图像检测推理

在下载的测试图像上运行检测

``` python
[neth, netw] = dshape[2:]
test_image = "person.jpg"
img_url = REPO_URL + "data/" + test_image + "?raw=true"


m0

        .endm

/*++

Macro Description:

    This macro generates code to execute the block compute macro multiple
    times and advancing the matrix A and matrix B data pointers.

Arguments:

    ComputeBlock - Supplies the macro to compute a single block.

    RowCount - Supplies the number of rows to process.

Implicit Arguments:

    ebx - Supplies the number of bytes to the next row of matrix A.

    ecx - Supplies the address into the matrix A data.

    edx - Supplies the address into the matrix B data.

    edi - Supplies the number of columns from matrix A and the number of rows
        from matrix B to iterate over.

    xmm4-xmm7 - Supplies the block accumulators.

--*/

        .macro ComputeBlockSseLoop RowCount

        sub     edi,4
        jb      .LProcessRemainingBlocks\@

.LComputeBlockBy4Loop\@:
        movups  xmm1,XMMWORD PTR [ecx]
        ComputeBlockSseBy\RowCount\() 0, 0x00
        ComputeBlockSseBy\RowCount\() 16*4, 0x55
        sub     edx,-32*4                   # advance matrix B by 32 columns
        ComputeBlockSseBy\RowCount\() 0, 0xAA
        ComputeBlockSseBy\RowCount\() 16*4, 0xFF
        sub     edx,-32*4                   # advance matrix B by 32 columns
        add     ecx,4*4                     # advance matrix A by 4 columns
        sub     edi,4
        jae     .LComputeBlockBy4Loop\@

.LProcessRemainingBlocks\@:
        add     edi,4                       # correct for over-subtract above
        jz      .LOutputBlock\@

.LComputeBlockBy1Loop\@:
        movss   xmm1,DWORD PTR [ecx]
        ComputeBlockSseBy\RowCount\() 0, 0x00
        add     edx,16*4                    # advance matrix B by 16 columns
        add     ecx,4                       # advance matrix A by 1 column
        dec     edi
        jne     .LComputeBlockBy1Loop\@

.LOutputBlock\@:

        .endm

/*++

Routine Description:

    This routine is an inner kernel to compute matrix multiplication for a
    set of rows.

Arguments:

    A - Supplies the address of matrix A.

    B - Supplies the address of matrix B. The matrix data has been packed using
        MlasSgemmCopyPackB or MlasSgemmTransposePackB.

    C - Supplies the address of matrix C.

    CountK - Supplies the number of columns from matrix A and the number of
        rows from matrix B to iterate over.

    CountM - Supplies the maximum number of rows that can be processed for
        matrix A and matrix C. The actual number of rows handled for this
        invocation depends on the kernel implementation.

    CountN - Supplies the number of columns from matrix B and matrix C to
        iterate over.

    lda - Supplies the first dimension of matrix A.

    ldc - Supplies the first dimension of matrix C.

    Alpha - Supplies the scalar multiplier (see SGEMM definition).

    ZeroMode - Supplies true if the output matrix must be zero initialized,
        else false if the output matrix is accumulated into.

Return Value:

    Returns the number of rows handled.

--*/

        FUNCTION_ENTRY MlasGemmFloatKernelSse

        push    ebp
        push    ebx
        push    esi
        push    edi
        mov     edx,.LSgemmKernelFrame_MatrixB[esp]
        mov     esi,.LSgemmKernelFrame_MatrixC[esp]
        mov     ebp


ip();
					if( line.get_first() == ',' ) {
						++line; line.skip_whitespace();
						strref SectType = line.get_word();
						// check if section already listed
						bool sectionFound = false;
						for(auto &section : listfile->m_sections) {
							if( section->m_name.same_str( SectName ) ) {
								currSection = section;
								sectionFound = true;
								break;
							}
						}
						if( !sectionFound ) {
							ListSection* section = new ListSection;
							section->m_name = SectName;
							section->m_type = SectType;
							listfile->m_sections.push_back( section );
							currSection = listfile->m_sections[ listfile->m_sections.size() - 1 ];
						}
					}
				}
			} else if( currSection && line.get_first() == '$' ) {
				ListLineInfo info;
				info.m_numBytes = 0;
				info.m_line = line + 40;
				info.m_line.clip_trailing_whitespace();
				++line;
				// if address is already used in this section ignore the new one
				uint16_t addr = (uint16_t)line.ahextoui_skip();
				if( addr && !currSection->m_lines.Exists(addr) ) {	// 0 is not a valid hash key
					++line;
					while( strref::is_hex(line.get_first()) && strref::is_ws(line[2]) && info.m_numBytes < 7 ) {
						info.m_bytes[ info.m_numBytes++ ] = (uint8_t)line.ahextoui_skip();
						++line;
					}
					currSection->m_lines.Insert(addr, info);
					assert( currSection->m_lines.Value( addr ) );
				}
			}
		}

		if( sListing ) {
			delete sListing;
		}
		sListing = listfile;
	}
}

// example for creating a texture:
// static void ImGui_ImplDX11_CreateFontsTexture()
#include <stdio.h>
#include "imgui/imgui.h"
#include "Views.h"
#include "machine.h"
#include "GfxView.h"
#include "Image.h"
#include "Expressions.h"
#include "Config.h"
#include "ViceConnect.h"

#ifndef _MSC_VER
#define sprintf_s sprintf
#endif

extern unsigned char _fruitFont[];
extern unsigned char _aStartupFont[];

static const char a2c_lookup[] = {
	0, 0, 0, 0, 2, 2, 3, 3,
	0, 0, 1, 1, 3, 3, 3, 3,
	0, 0, 0, 0, 2, 2, 3, 3,
	0, 0, 1, 0, 3, 3, 3, 3,
	0, 0, 0, 0, 1, 1, 3, 3,
	0, 0, 0, 0, 1, 1, 3, 3,
	0, 0, 2, 2, 3, 3, 3, 3,
	0, 0, 2, 0, 3, 3, 3, 3,
};

static const char a2c_colors[] = {
	3, 5, 6, 4, 3, 7, 8, 4
};

static GfxView::Mode sGenericModes[] = { GfxView::Planar, GfxView::Columns };
static GfxView::Mode sC64Modes[] = { GfxView::C64_Bitmap, GfxView::C64_ColBitmap,
									 GfxView::C64_Sprites, GfxView::C64_Text,
									 GfxView::C64_ExtText, GfxView::C64_Text_MC,
									 GfxView::C64_MCBM, GfxView::C64_ColumnScreen_MC,
									 GfxView::C64_Current };
static GfxView::Mode Apple2Modes[] = { GfxView::Apl2_Text, GfxView::Apl2_Hires, GfxView::Apl2


      }

      // if there is a translate() transform
      if (
        pathItem.instruction === 'M' &&
        (matrix.data[4] !== 0 || matrix.data[5] !== 0)
      ) {
        // then apply it only to the first absoluted M
        newPoint = transformPoint(
          matrix.data,
          pathItem.data[0],
          pathItem.data[1],
        );
        set(pathItem.data, newPoint);
        set(pathItem.coords, newPoint);

        // clear translate() data from transform matrix
        matrix.data[4] = 0;
        matrix.data[5] = 0;
      } else {
        if (pathItem.instruction === 'a') {
          transformArc(pathItem.data, matrix.data);

          // reduce number of digits in rotation angle
          if (Math.abs(pathItem.data[2]) > 80) {
            const a = pathItem.data[0];
            const rotation = pathItem.data[2];
            pathItem.data[0] = pathItem.data[1];
            pathItem.data[1] = a;
            pathItem.data[2] = rotation + (rotation > 0 ? -90 : 90);
          }

          newPoint = transformPoint(
            matrix.data,
            pathItem.data[5],
            pathItem.data[6],
          );
          pathItem.data[5] = newPoint[0];
          pathItem.data[6] = newPoint[1];
        } else {
          for (let i = 0; i < pathItem.data.length; i += 2) {
            newPoint = transformPoint(
              matrix.data,
              pathItem.data[i],
              pathItem.data[i + 1],
            );
            pathItem.data[i] = newPoint[0];
            pathItem.data[i + 1] = newPoint[1];
          }
        }

        pathItem.coords[0] =
          pathItem.base[0] + pathItem.data[pathItem.data.length - 2];
        pathItem.coords[1] =
          pathItem.base[1] + pathItem.data[pathItem.data.length - 1];
      }
    }
  });

  // remove transform attr
  // elem.removeAttr('transform');

  return path;
}

export function getGroupAttrs(group: JsApi) {
  const px = getGroupAttr(group, 'pivotX', 0);
  const py = getGroupAttr(group, 'pivotY', 0);
  const sx = getGroupAttr(group, 'scaleX', 1);
  const sy = getGroupAttr(group, 'scaleY', 1);
  const tx = getGroupAttr(group, 'translateX', 0);
  const ty = getGroupAttr(group, 'translateY', 0);
  const r = getGroupAttr(group, 'rotation', 0);
  return { px, py, sx, sy, tx, ty, r };
}

function getGroupAttr(
  group: JsApi,
  attrLocalName: string,
  defaultValue: number,
) {
  const attrName = `android:${attrLocalName}`;
  const result = group.hasAttr(attrName)
    ? +group.attr(attrName).value
    : defaultValue;
  return result;
}

function removeGroupAttrs(group: JsApi) {
  group.removeAttr('android:pivotX');
  group.removeAttr('android:pivotY');
  group.removeAttr('android:scaleX');
  group.removeAttr('android:scaleY');
  group.removeAttr('android:


n PVPHeroSelectChatCtrl:UpdateData(data)
  self.click_text:GetComponent("UnityEngine.UI.Text").text = data.MessageDetail
  self:InitScrollLogText(data,self.input_scroll_log)
  if PVPHeroSelectAPI~=nil and PVPHeroSelectAPI.Instance~=nil then
    PVPHeroSelectAPI.Instance:SetPlayerChat(data)
  end
  if DraftHeroSelectAPI~=nil and DraftHeroSelectAPI.Instance~=nil then
    DraftHeroSelectAPI.Instance:SetPlayerChat(data)
  end
end

--------------------

--聊天记录
function PVPHeroSelectChatCtrl:InitScrollLogText(data,scroll)
  local temp = self:CreateScrollText(scroll)
  temp:FindChild("Text"):GetComponent("UnityEngine.UI.Text").text = data.MessageDetail
  temp:FindChild("Click").gameObject:SetActive(false)
end
--聊天信息选择
function PVPHeroSelectChatCtrl:InitScrollInfoText(text,scroll)
  local temp = self:CreateScrollText(scroll)
  temp:FindChild("Text"):GetComponent("UnityEngine.UI.Text").text = text
  temp:FindChild("Click").gameObject:SetActive(true)
  UITools.GetLuaScript(temp:FindChild("Click").gameObject,"Logic.UICommon.UIClick"):RegisterClickDelegate(self,self.ClickInfoText,text)
end

function PVPHeroSelectChatCtrl:CreateScrollText(scroll)
  local temp = GameObject.Instantiate(self.temp_text)
  temp.name = "text"
  temp.gameObject:SetActive(true)
  temp.transform:SetParent(scroll:FindChild("Grid"))
  temp.transform.localPosition = Vector3.zero
  temp.transform.localRotation = Quaternion.identity
  temp.transform.localScale = Vector3.one
  return temp
end
--
function  PVPHeroSelectChatCtrl:ClickInfoText(text)
  if self.coroutine_inputtip~=nil then
    GameManager.CreatePanel("SelfHideNotice")
    SelfHideNoticeAPI.Instance:InitNoticeForSelfHideNotice("您说话太快了，请稍等哟~")
    return
  end
  self:RequestSendTrialPartyChatMessage(self.partyId,1,text)
  self:InputCD()
end

--队伍聊天
function PVPHeroSelectChatCtrl:RequestSendTrialPartyChatMessage(partyid,mestype,mes)
  local request = NetRequest.New()
  request.Content = JObject.New(JProperty.New("Type","RequestSendTrialPartyChatMessage"),
                                JProperty.New("TrialpartyId",tonumber(partyid)),
                                JProperty.New("MessageType",tonumber(mestype)),
                                JProperty.New("Message",tostring(mes)))
  request.Handler = TGNetService.NetEventHanlderSelf(self.RequestHandler,self)
  TGNetService.GetInstance():SendRequest(request)
end
function PVPHeroSelectChatCtrl:RequestHandler(e)
  if e.Type =="RequestSendTrialPartyChatMessage" then
    local result = tonumber(e.Content:get_Item("Result"):ToString())
    if result == 0 then
      Debugger.LogError("RequestSendTrialPartyChatMessage Result == "..0)
    elseif result == 1 then
    end
    return true
  end
  return false
end

--打开聊天
function PVPHeroSelectChatCtrl:ClickOpenInput()
  self.input.gameObject:SetActive(true)
  self.click.gameObject:SetActive(false)
end
--关闭聊天
function PVPHeroSelectChatCtrl:ClickCloseInput()
  self.input.gameObject:SetActive(false)
  self.click.gameObject:SetActive(true)


box_ext .fermer, .loginbox .fermer {
   float:right;
  font-size: 11px;
  line-height: 18px;
  color: #747b83;
   cursor:pointer;
}

.lightbox_ext .fermer span, .loginbox .fermer span {
  display: inline-block;
  width: 10px;
  height: 10px;
  margin: 0 0 0 3px;
  background: url('/medias/web/img/sprites/icos_petites.png') no-repeat -11px -191px;
}

.lightbox_ext .fermer:hover , .loginbox .ferme:hover  {
   color: #fff;
   text-decoration: none;
}

.lightbox_ext .fermer:hover span, .loginbox .fermer:hover span {
   background-position: 0 -191px;
}

.loginbox .message {
  padding:10px;
  background:#eef1f5;
}

.loginbox .login_form {
  position: relative;
  float: left;
  width: 245px;
  height: 235px;
  padding: 10px 15px;
  border-right: 1px solid #fff;
}

.lightbox_ext .intitule, .loginbox  .intitule {
  margin: 0 0 15px 0;
  font-size: 18px;
  line-height: 18px;
  color: #000;
  font-weight: bold;
}

.loginbox span {
   display:block;
}

.loginbox label {
   display:block;
  margin: 0 15px 5px 0;
  color: #747b83;
}

.loginbox .choix {
  margin: 15px 0;
  font-size: 11px;
}

.loginbox .choix label {
  float: left
}

label i {
   display:none;
   font-style:normal;
   display:none;
}
.saisie_erreur label i {
   display:inline;
}

.boite_formulaire .erreur {
   display:none;
}

.loginbox .back {
   padding:0 15px;
   line-height:4rem;
   border-top:1px solid #d2d6db;
}

.loginbox #login_error_email {
   background: #f2dede;
  border:solid 1px #c00;
   color:#c00;
   text-align:center;
}

.loginbox .signup {
  float: left;
  width: 180px;
  height: 230px;
  padding: 10px 40px 10px 15px;
  border-right: 1px solid #fff;
  border-left: 1px solid #e4e6e9;
  font-size: 14px;
  line-height: 140%;
}

.loginbox .accroche {
  display: block;
  margin: 20px 0 15px;
  color: #464f57;
}

.loginbox .abonne_journal {
  position: relative;
  float: left;
  width: 185px;
  height: 235px;
  padding: 10px 55px 10px 16px;
  font-size: 14px;
  line-height: 140%;
  background: url('/medias/web/img/elements_lm/login_box_journal.jpg') no-repeat right 130px;
  border-left: 1px solid #e4e6e9;
}

.loginbox .login_form  .btn_abo, .loginbox .abonne_journal .btn {
  position: absolute;
  bottom: 15px;
  left: 16px;
}
.loginbox .rmdp .btn {
   position:static;
   margin:15px 0;
}
.loginbox #password_recover_box_email {
   width:300px;
}

.rmdp {
   pa


ment) => {
        if (comment.type === 'Line')
          str += `${whitespace}//${comment.value}\n`;
        else if (comment.type === 'Block')
          str += `${whitespace}/*${comment.value}*/\n`;
      });
      str += `${whitespace}${sourceCode.getText(property)}`;
      return str;
    })
    .join(',\n');

  // Check after the last property for any additional comments
  const possibleComma = sourceCode.getTokenAfter(properties[properties.length - 1]);
  if (possibleComma.value === ',') {
    const nextNode = sourceCode.getTokenAfter(possibleComma, { includeComments: true });
    if (nextNode.type === 'Line' || nextNode.type === 'Block')
      return undefined;
  }

  return `{\n${sortedPropertiesText},\n${' '.repeat(properties[0].loc.start.column - 2)}}`;
};

module.exports = {
  generateValidList,
  generateValidObject,
};
import { addOverlayListener } from '../../resources/overlay_plugin_api';

import ContentType from '../../resources/content_type';
import Util from '../../resources/util';
import ZoneInfo from '../../resources/zone_info';

export const defaultOptions = {
  Language: 'en',
  IgnoreContentTypes: [
    ContentType.Pvp,
    ContentType.Eureka,
  ],
};

let gIgnoreCurrentZone = false;
let gIgnoreCurrentJob = false;
let gCurrentJob = null;
let gCurrentZone = null;
let gInCombat = false;

export const InitDpsModule = function(options, updateFunc, hideFunc) {
  addOverlayListener('CombatData', (e) => {
    // DPS numbers in large pvp is not useful and hella noisy.
    if (gIgnoreCurrentZone || gIgnoreCurrentJob)
      return;

    // When ACT stops, stop updating.  This is mostly to avoid
    // a spurious update when changing zones which will unhide
    // the dps overlay.
    if (!gInCombat)
      return;

    // Don't bother showing the first "Infinity" dps right as
    // combat starts.
    const dps = parseFloat(e.Encounter.encdps);
    if (dps <= 0 || dps === Infinity)
      return;

    updateFunc({ detail: e });
  });

  addOverlayListener('ChangeZone', (e) => {
    const newZone = e.zoneName;
    if (gCurrentZone === newZone)
      return;
    // Always hide on switching zones.
    hideFunc();
    gCurrentZone = newZone;

    const zoneInfo = ZoneInfo[e.zoneID];
    const contentType = zoneInfo ? zoneInfo.contentType : 0;
    gIgnoreCurrentZone = options.IgnoreContentTypes.includes(contentType);
  });

  addOverlayListener('onInCombatChangedEvent', (e) => {
    gInCombat = e.detail.inACTCombat;
  });

  addOverlayListener('onPlayerChangedEvent', (e) => {
    const job = e.detail.job;
    if (job === gCurrentJob)
      return;
    gCurrentJob = job;
    if (Util.isCombatJob(job)) {
      gIgnoreCurrentJob = false;
      return;
    }
    gIgnoreCurrentJob = true;
    hideFunc();
  });
};
import { addOverlayListener } from '../../../resources/overlay_plugin_api';

import UserConfig from '../../../resources/user_config';
import { defaultOptions, InitDpsModule } from '../dps_common';
import DpsPhaseTracker from './dps_phase_tracker';

import '../../../resources/defaults.css';
import './xephero.css';

const rows = 10;
let rdpsMax = 0;

function hideOverlay() {
  $('#overlay').addClass('hide');
}

function showOverlay() {
  $('#overlay').removeClass('hide');
}

function update(dps, tracker) {
  const encounter = dps.Encounter;
  const rdps


4,0,3,2,9,2,1,\cdots$。

若工作集的窗口大小为$6$，则在$t$时刻的工作集为()。

$A.\{6,0,3,2\}$

$B.\{2,3,0,4\}$

$C.\{0,4,3,2,9\}$

$D.\{4,5,6,0,3,2\}$

解：$A$。在任一时刻$t$，都存在一个集合，它包含所有最近$k$次（该题窗口大小为$6$）内存访问所访问过的页面。这个集合$w(k,t)$就是工作集。题中最近$6$次访问的页面分别为$6,0,3,2,3,2$，去除重复的页面，形成的工作集为$\{6,0,3,2\}$。
# 设备管理习题

## I/O概述

### I/O设备的基本概念、

**例题** 以下关于设备属性的叙述中，正确的是()。

$A.$字符设备的基本特征是可寻址到字节，即能指定输入的源地址或输出的目标地址

$B.$共享设备必须是可寻址的和可随机访问的设备

$C.$共享设备是指同一时间内允许多个进程同时访问的设备

$D.$在分配共享设备和独占设备时都可能引起进程死锁

解：$B$。可寻址是块设备的基本特征，$A$选项不正确。共享设备是指一段时间内允许多个进程同时访问的设备，因此$C$选项不正确。分配共享设备是不会引起进程死锁的，$D$选项不正确。

### I/O控制方式

#### 通道控制方式

**例题** ()用作连接大量的低速或中速$I/O$设备。

$A.$数据选择通道

$B.$字节多路通道

$C.$数据多路通道

$D.I/O$处理机

解：$B$。字节多路通道，它通常含有许多非分配型子通道，其数量可达几十到几百个，每个通道连接一台$I/O$设备，并控制该设备的$I/O$操作。这些子通道按时间片轮转方式共享主通道。各个通道循环使用主通道，各个通道每次完成其$I/O$设备的一个字节的交换，然后让出主通道的使用权。这样，只要字节多路通道扫描每个子通道的速率足够快，而连接到子通道上的设备的速率不太高时，便不至于丢失信息。

**例题** 系统将数据从磁盘读


.to_ty(tcx).sty).map(Integral)
                },
                Some(ty_hint) => bug!("bad ty_hint: {:?}, {:?}", ty_hint, lit),
            }
        },
        LitKind::Int(n, Unsigned(ity)) => {
            infer(Infer(n), tcx, &ty::TyUint(ity)).map(Integral)
        },

        LitKind::Float(ref n, fty) => {
            parse_float(n, Some(fty)).map(Float)
        }
        LitKind::FloatUnsuffixed(ref n) => {
            let fty_hint = match ty_hint.map(|t| &t.sty) {
                Some(&ty::TyFloat(fty)) => Some(fty),
                _ => None
            };
            parse_float(n, fty_hint).map(Float)
        }
        LitKind::Bool(b) => Ok(Bool(b)),
        LitKind::Char(c) => Ok(Char(c)),
    }
}

fn parse_float(num: &str, fty_hint: Option<ast::FloatTy>)
               -> Result<ConstFloat, ErrKind> {
    let val = match fty_hint {
        Some(ast::FloatTy::F32) => num.parse::<f32>().map(F32),
        Some(ast::FloatTy::F64) => num.parse::<f64>().map(F64),
        None => {
            num.parse::<f32>().and_then(|f32| {
                num.parse::<f64>().map(|f64| {
                    FInfer { f32: f32, f64: f64 }
                })
            })
        }
    };
    val.map_err(|_| {
        // FIXME(#31407) this is only necessary because float parsing is buggy
        UnimplementedConstVal("could not evaluate float literal (see issue #31407)")
    })
}

pub fn compare_const_vals(tcx: TyCtxt, span: Span, a: &ConstVal, b: &ConstVal)
                          -> Result<Ordering, ErrorReported>
{
    let result = match (a, b) {
        (&Integral(a), &Integral(b)) => a.try_cmp(b).ok(),
        (&Float(a), &Float(b)) => a.try_cmp(b).ok(),
        (&Str(ref a), &Str(ref b)) => Some(a.cmp(b)),
        (&Bool(a), &Bool(b)) => Some(a.cmp(&b)),
        (&ByteStr(ref a), &ByteStr(ref b)) => Some(a.cmp(b)),
        (&Char(a), &Char(ref b)) => Some(a.cmp(b)),
        _ => None,
    };

    match result {
        Some(result) => Ok(result),
        None => {
            // FIXME: can this ever be reached?
            span_err!(tcx.sess, span, E0298,
                      "type mismatch comparing {} and {}",
                      a.description(),
                      b.description());
            Err(ErrorReported)
        }
    }
}

pub fn compare_lit_exprs<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
                                   span: Span,
                                   a: &Expr,
                                   b: &Expr) -> Result<Ordering, ErrorReported> {
    let a = match eval_const_expr_partial(tcx, a, ExprTypeChecked, None) {
        Ok(a) => a,
        Err(e) => {
            report_const_eval_err(tcx, &e, a.span, "expression").emit();
            return Err(ErrorReported);
        }
    };
    let b = match eval_const_expr_partial(tcx, b, ExprTypeChecked, None) {
        Ok(b) => b,
        Err(e) => {
            report_const_eval_err(tcx, &e, b.span


using Layer.func;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Layer.mode
{
    class mode_enumerate
    {
        info.DnsInfo ReqDns = null;

        //计数
        int count = 0;
        public mode_enumerate(info.DnsInfo dnsinfo)
        {
            ReqDns = dnsinfo;
        }

        public void start()
        {
            foreach (string item in F_main.diclist)
            {
                ThreadPool.QueueUserWorkItem(_ =>
                {
                    if (F_main.isrun)
                    {
                        List<string> openPort = new List<string>();
                        count += 1;
                        F_main.FM.lbl_state.BeginInvoke(new Action(() =>
                        {
                            F_main.FM.lbl_state.Text = "状态：枚举模式，" + "已发现"+F_main.FM.LV_result.Items.Count +"个域名，进度" + count + "/" + F_main.diclist.Length + "  当前" + item + "." + ReqDns.Domain;
                        }));

                        DnsResolver Dns = new DnsResolver(item + "." + ReqDns.Domain, ReqDns.DnsServer, ReqDns.TimeOut);
                        if (Dns.IsSuccess && F_main.blackIp.Contains(Dns.Record[0]) == false)
                        {
                            //避免接口查询的和枚举的重复
                            if (!F_main.DomainList.Contains(item + "." + ReqDns.Domain))
                            {
                                F_main.DomainList.Add(item + "." + ReqDns.Domain);

                                //加入到ListView
                                ListViewItem list = new ListViewItem(item + "." + ReqDns.Domain);

                                if (Dns.Record.Count > 1)
                                {
                                    list.SubItems.Add(string.Join(",", Dns.Record.ToArray()));
                                }
                                else
                                {
                                    list.SubItems.Add(string.Join(",", Dns.Record[0]));
                                }

                                if (F_main.isGetPorts)
                                {
                                    //扫描开放端口
                                    openPort = Tools.ScanPort(Dns.Record[0], ReqDns.Ports);
                                }

                                if (openPort.Count > 0)
                                {
                                    list.SubItems.Add(string.Join(


CONTACT_RESET,
      payload: {}
    };
    expect(contact.resetContact()).toEqual(expectedResult);
  });

  it(`should return as expected when resetContact`, () => {
    const expectedResult = {
      type: E_CONTACT_ACTION.CONTACT_RESET,
      payload: {}
    };
    expect(contact.resetContact()).toEqual(expectedResult);
  });

  it(`should return as expected when setContact, the contact is ${CONTACTS[0]}`, () => {
    const expectedResult = {
      type: E_CONTACT_ACTION.CONTACT_SET_CONTACT,
      payload: { contact: CONTACTS[0] }
    };
    expect(contact.setContact(CONTACTS[0])).toEqual(expectedResult);
  });

  it(`should return as expected when setForm, the key is firstName and the value is Alan`, () => {
    const expectedResult = {
      type: E_CONTACT_ACTION.CONTACT_SET_FORM,
      payload: { key: "firstName", value: "Alan" }
    };
    expect(contact.setForm("firstName", "Alan")).toEqual(expectedResult);
  });

  it(`should return as expected when setErrorValidation`, () => {
    const expectedResult = {
      type: E_CONTACT_ACTION.CONTACT_SET_ERROR,
      payload: {
        errorValidation: {
          firstName: "Required",
          lastName: "",
          age: "Minimum 1",
          photo: "Invalid Url"
        }
      }
    };
    expect(
      contact.setErrorValidation({
        firstName: "Required",
        lastName: "",
        age: "Minimum 1",
        photo: "Invalid Url"
      })
    ).toEqual(expectedResult);
  });
});
exports.up = (knex) => {
   return knex.schema.createTable('province', table => {
      table.increments('id').primary();
      table.string('name').notNullable();
      table.string('code', 7).notNullable();
      table.string('capital').notNullable();
      table.string('language').notNullable();
      table.decimal('latitude', null).notNullable();
      table.decimal('longitude', null).notNullable();
      table.integer('area').notNullable();
   })
}

exports.down = (knex) => {
   return knex.schema.dropTable('province');
}import { NextApiRequest, NextApiResponse } from "next";
import { query as q } from 'faunadb';
import { getSession } from "next-auth/client";
import { fauna } from "../../services/fauna";
import { stripe } from "../../services/stripe";

//INTERFACE PASSADA AO USER
type User ={
    ref:{
        id:string;
    }
    data:{
        stripe_customer_id: string;
    }
}

export default async (req: NextApiRequest, res:NextApiResponse) => {
//COMO NÃO É UMA ROTA BACK END, NÃO TEMOS COMO SABER QUE ESSA FUNÇÃO SÓ VAI ESTAR DISPONÍVEL COM O MÉTODO HTTP POST
//VAMOS FAZER A CHECAGEM DO MÉTODO QUE ESTÁ SENDO PASSADO, SEMPRE QUE ESTOU CRIANDO ALGUMA COISA É O MÉTODO POST
//CASO O MÉTODO FOR DO TIPO POST VAMOS CRIAR UMA SESSÃO DO STRIPE
    if(req.method === 'POST'){
        const session = await getSession({ req })

        //FAZENDO UMA BUSCA NOS INDICES DO BANCO DE DADOS POR UM USUÁRIO COM O EMAIL INFORMADO NA SESSION
        //DENTRO DESSE USUÁRIO RETORNADO DENTRO DO FAUNA DEN


00 08 */	stb r0, 8(r19)
/* 8001DCDC 0001AADC  7F 75 FA 14 */	add r27, r21, r31
/* 8001DCE0 0001AAE0  39 E0 00 00 */	li r15, 0
/* 8001DCE4 0001AAE4  3A 00 00 00 */	li r16, 0
/* 8001DCE8 0001AAE8  48 00 00 60 */	b lbl_8001DD48
lbl_8001DCEC:
/* 8001DCEC 0001AAEC  88 9D 00 00 */	lbz r4, 0(r29)
/* 8001DCF0 0001AAF0  7C 80 07 74 */	extsb r0, r4
/* 8001DCF4 0001AAF4  2C 00 FF FF */	cmpwi r0, -1
/* 8001DCF8 0001AAF8  40 82 00 24 */	bne lbl_8001DD1C
/* 8001DCFC 0001AAFC  88 7C 00 00 */	lbz r3, 0(r28)
/* 8001DD00 0001AB00  7C 60 07 74 */	extsb r0, r3
/* 8001DD04 0001AB04  2C 00 FF FF */	cmpwi r0, -1
/* 8001DD08 0001AB08  41 82 00 34 */	beq lbl_8001DD3C
/* 8001DD0C 0001AB0C  38 0F 00 1C */	addi r0, r15, 0x1c
/* 8001DD10 0001AB10  39 EF 00 01 */	addi r15, r15, 1
/* 8001DD14 0001AB14  7C 7B 01 AE */	stbx r3, r27, r0
/* 8001DD18 0001AB18  48 00 00 24 */	b lbl_8001DD3C
lbl_8001DD1C:
/* 8001DD1C 0001AB1C  38 60 00 01 */	li r3, 1
/* 8001DD20 0001AB20  48 02 C1 05 */	bl func_80049E24
/* 8001DD24 0001AB24  2C 03 00 00 */	cmpwi r3, 0
/* 8001DD28 0001AB28  41 82 00 14 */	beq lbl_8001DD3C
/* 8001DD2C 0001AB2C  88 7C 00 00 */	lbz r3, 0(r28)
/* 8001DD30 0001AB30  38 0F 00 1C */	addi r0, r15, 0x1c
/* 8001DD34 0001AB34  39 EF 00 01 */	addi r15, r15, 1
/* 8001DD38 0001AB38  7C 7B 01 AE */	stbx r3, r27, r0
lbl_8001DD3C:
/* 8001DD3C 0001AB3C  3B BD 00 01 */	addi r29, r29, 1
/* 8001DD40 0001AB40  3B 9C 00 01 */	addi r28, r28, 1
/* 8001DD44 0001AB44  3A 10 00 01 */	addi r16, r16, 1
lbl_8001DD48:
/* 8001DD48 0001AB48  7E 00 07 74 */	extsb r0, r16
/* 8001DD4C 0001AB4C  2C 00 00 04 */	cmpwi r0, 4
/* 8001DD50 0001AB50  41 80 FF 9C */	blt lbl_8001DCEC
/* 8001DD54 0001AB54  99 F3 00 12 */	stb r15, 0x12(r19)
/* 8001DD58 0001AB58  3A 52 00 01 */	addi r18, r18, 1
/* 8001DD5C 0001AB5C  3B FF 00 04 */	addi r31, r31, 4
lbl_8001DD60:
/* 8001DD60 0001AB60  3B 5A 00 01 */	addi r26, r26, 1
/* 8


{ $theme := index site.Data.themes $theme_index }}

  {{- $scr.Set "light" ($theme.light | default true) -}}

  {{ if $theme.light }}
    {{- $scr.Set "background" ($theme.background | default "#fff") -}}
    {{- $scr.Set "dark_background" "rgb(40, 42, 54)" -}}
    {{- $scr.Set "home_section_odd" $theme.home_section_odd -}}
    {{- $scr.Set "home_section_even" $theme.home_section_even -}}
    {{- $scr.Set "dark_home_section_odd" "hsla(231, 15%, 18%, 1)" -}}
    {{- $scr.Set "dark_home_section_even" "hsla(231, 15%, 16%, 1)" -}}
  {{ else }}
    {{- $scr.Set "background" ($theme.background | default "#fff") -}}
    {{- $scr.Set "dark_background" ($theme.background | default "rgb(40, 42, 54)") -}}
    {{- $scr.Set "home_section_odd" "rgb(255, 255, 255)" -}}
    {{- $scr.Set "home_section_even" "rgb(247, 247, 247)" -}}
    {{- $scr.Set "dark_home_section_odd" $theme.home_section_odd -}}
    {{- $scr.Set "dark_home_section_even" $theme.home_section_even -}}
  {{ end }}

  {{- $scr.Set "link" ($theme.link | default $theme.primary) -}}
  {{- $scr.Set "link_hover" ($theme.link_hover | default $theme.primary) -}}

  {{- $scr.Set "primary" $theme.primary -}}

  {{- $scr.Set "menu_primary" $theme.menu_primary -}}
  {{- $scr.Set "menu_text" $theme.menu_text -}}
  {{- $scr.Set "menu_text_active" $theme.menu_text_active -}}
  {{- $scr.Set "menu_title" $theme.menu_title -}}

{{ else }}
  {{ errorf "The `%s` color theme was not found! Check that the `color_theme` option in `config/_default/params.toml` matches the name of an installed color theme." $theme_index }}
{{ end }}

              {{ .Title }}

                  Home

                  {{ .Title }}

          <svg
            class="text-primary"
            style="opacity:.15"
            width="100%"
            height="100%"
            viewBox="0 0 1381 283"
            fill="none"
            xmlns="http://www.w3.org/2000/svg">
            <path
              d="M1379 0.998871C1346.3 58.3528 1186.5 172.501 961.409 121.133C645.85 49.1205


Text(text = desc, style = MaterialTheme.typography.bodyMedium)
                }
                Row {
                    IconButton(onClick = onEdit) {
                        Icon(Icons.Default.Edit, stringResource(id = R.string.edit_desc, name))
                    }

                    var showOptions by remember { mutableStateOf(false) }
                    IconButton(onClick = { showOptions = true }) {
                        Icon(
                            Icons.Default.MoreVert,
                            stringResource(id = R.string.more_options_desc, name)
                        )
                        DropdownMenu(
                            expanded = showOptions,
                            onDismissRequest = { showOptions = false }) {

                            DropdownMenuItem(
                                text = { Text(stringResource(id = R.string.export_config)) },
                                onClick = {
                                    showOptions = false
                                    onExport()
                                },
                                leadingIcon = {
                                    Icon(Icons.Default.Output, null)
                                }
                            )

                            HorizontalDivider()

                            DropdownMenuItem(
                                text = {
                                    Text(
                                        stringResource(id = R.string.delete),
                                        color = MaterialTheme.colorScheme.error
                                    )
                                },
                                onClick = {
                                    showOptions = false
                                    onDelete()
                                },
                                leadingIcon = {
                                    Icon(
                                        Icons.Default.DeleteForever,
                                        null,
                                        tint = MaterialTheme.colorScheme.error
                                    )
                                }
                            )
                        }
                    }

                }
            }

        }
    }
}package com.github.jing332.tts_server_android.model.updater

import android.os.Build
import android.util.Log
import com.github.jing332.tts_server_android.BuildConfig
import com.github.jing332.common.utils.toNumberInt
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter

object AppUpdateChecker {
    const val TAG = "AppUpdateChecker"

    fun checkUpdate(): UpdateResult {
        val rel = Github.getLatestRelease()

        val latest = rel.tagName.toNumberInt()
        val current = BuildConfig.VERSION_NAME.toNumberInt()
        Log.i(TAG, "checkUpdate: current=$current, latest=$latest")

        if (current < latest) {
            val ass = getApkDownloadUrl(rel.assets)
            return UpdateResult(
                version = rel.tagName,
                content = rel.body,
                downloadUrl = ass.browserDownloadUrl
            ).apply {
                Log.i(TAG, "checkUpdate: hasUpdate=${this.downloadUrl}")
            }
        }

        return UpdateResult()
    }

    private fun getApkDownloadUrl(assets: List<Github.Release.Asset>): Github.Release.Asset {
        val abi = Build.SUPPORTED_ABIS[0]

        // 最大的为全量apk
        val apkUniversal = assets.sortedByDescending { it.size }[0]
        // 根据CPU ABI判断精简版apk
        val liteApk =
            assets.find { it.name.endsWith("${abi}.apk") }

        return liteApk ?: apkUniversal
    }

    private fun toTimestamp(str: String): Long {
        val formatte


C  38 00 00 2B */	li r0, 0x2b
/* 8009CA40 000986A0  38 60 00 06 */	li r3, 6
/* 8009CA44 000986A4  38 80 00 05 */	li r4, 5
/* 8009CA48 000986A8  90 05 00 DC */	stw r0, 0xdc(r5)
/* 8009CA4C 000986AC  38 A0 00 01 */	li r5, 1
/* 8009CA50 000986B0  48 0C 5E F1 */	bl func_80162940
/* 8009CA54 000986B4  80 8D 82 80 */	lwz r4, lbl_8063D540-_SDA_BASE_(r13)
/* 8009CA58 000986B8  88 04 00 E2 */	lbz r0, 0xe2(r4)
/* 8009CA5C 000986BC  2C 00 00 02 */	cmpwi r0, 2
/* 8009CA60 000986C0  41 82 00 6C */	beq lbl_8009CACC
/* 8009CA64 000986C4  40 80 00 10 */	bge lbl_8009CA74
/* 8009CA68 000986C8  2C 00 00 01 */	cmpwi r0, 1
/* 8009CA6C 000986CC  40 80 00 14 */	bge lbl_8009CA80
/* 8009CA70 000986D0  48 00 0D 78 */	b lbl_8009D7E8
lbl_8009CA74:
/* 8009CA74 000986D4  2C 00 00 FF */	cmpwi r0, 0xff
/* 8009CA78 000986D8  41 82 00 60 */	beq lbl_8009CAD8
/* 8009CA7C 000986DC  48 00 0D 6C */	b lbl_8009D7E8
lbl_8009CA80:
/* 8009CA80 000986E0  48 07 9C 05 */	bl func_80116684
/* 8009CA84 000986E4  48 07 FE F1 */	bl func_8011C974
/* 8009CA88 000986E8  7C 7F 1B 78 */	mr r31, r3
/* 8009CA8C 000986EC  38 60 00 01 */	li r3, 1
/* 8009CA90 000986F0  38 80 00 01 */	li r4, 1
/* 8009CA94 000986F4  38 A0 00 02 */	li r5, 2
/* 8009CA98 000986F8  38 C0 03 EB */	li r6, 0x3eb
/* 8009CA9C 000986FC  38 E0 00 04 */	li r7, 4
/* 8009CAA0 00098700  39 00 00 02 */	li r8, 2
/* 8009CAA4 00098704  48 08 11 4D */	bl func_8011DBF0
/* 8009CAA8 00098708  38 60 00 00 */	li r3, 0
/* 8009CAAC 0009870C  48 08 12 FD */	bl func_8011DDA8
/* 8009CAB0 00098710  80 7F 00 00 */	lwz r3, 0(r31)
/* 8009CAB4 00098714  38 00 00 8E */	li r0, 0x8e
/* 8009CAB8 00098718  64 63 70 00 */	oris r3, r3, 0x7000
/* 8009CABC 0009871C  90 7F 00 00 */	stw r3, 0(r31)
/* 8009CAC0 00098720  80 6D 82 80 */	lwz r3, lbl_8063D540-_SDA_BASE_(r13)
/* 8009CAC4 00098724  90 03 00 DC */	stw r0, 0xdc(r3)
/* 8009CAC8 00098728  48 00 0D 20 */	b lbl_8009D7E8
lbl_8009C


1_0.orig_cl_ord_id.display = function(value)
  return "Orig Cl Ord Id: "..value
end

-- Dissect: Orig Cl Ord Id
cboe_futures_orderentry_boe3_v1_0.orig_cl_ord_id.dissect = function(buffer, offset, packet, parent)
  local length = cboe_futures_orderentry_boe3_v1_0.orig_cl_ord_id.size
  local range = buffer(offset, length)
  local value = range:string()
  local display = cboe_futures_orderentry_boe3_v1_0.orig_cl_ord_id.display(value, buffer, offset, packet, parent)

  parent:add(omi_cboe_futures_orderentry_boe3_v1_0.fields.orig_cl_ord_id, range, value, display)

  return offset + length, value
end

-- Modify Rejected Message
cboe_futures_orderentry_boe3_v1_0.modify_rejected_message = {}

-- Size: Modify Rejected Message
cboe_futures_orderentry_boe3_v1_0.modify_rejected_message.size =
  cboe_futures_orderentry_boe3_v1_0.transaction_time.size +
  cboe_futures_orderentry_boe3_v1_0.cl_ord_id.size +
  cboe_futures_orderentry_boe3_v1_0.orig_cl_ord_id.size +
  cboe_futures_orderentry_boe3_v1_0.clearing_firm.size +
  cboe_futures_orderentry_boe3_v1_0.modify_reject_reason.size +
  cboe_futures_orderentry_boe3_v1_0.text.size

-- Display: Modify Rejected Message
cboe_futures_orderentry_boe3_v1_0.modify_rejected_message.display = function(packet, parent, length)
  return ""
end

-- Dissect Fields: Modify Rejected Message
cboe_futures_orderentry_boe3_v1_0.modify_rejected_message.fields = function(buffer, offset, packet, parent)
  local index = offset

  -- Transaction Time: DateTime
  index, transaction_time = cboe_futures_orderentry_boe3_v1_0.transaction_time.dissect(buffer, index, packet, parent)

  -- Cl Ord Id: Text
  index, cl_ord_id = cboe_futures_orderentry_boe3_v1_0.cl_ord_id.dissect(buffer, index, packet, parent)

  -- Orig Cl Ord Id: Text
  index, orig_cl_ord_id = cboe_futures_orderentry_boe3_v1_0.orig_cl_ord_id.dissect(buffer, index, packet, parent)

  -- Clearing Firm: Alpha
  index, clearing_firm = cboe_futures_orderentry_boe3_v1_0.clearing_firm.dissect(buffer, index, packet, parent)

  -- Modify Reject Reason: Text
  index, modify_reject_reason = cboe_futures_orderentry_boe3_v1_0.modify_reject_reason.dissect(buffer, index, packet, parent)

  -- Text: Text
  index, text = cboe_futures_orderentry_boe3_v1_0.text.dissect(buffer, index, packet, parent)

  return index
end

-- Dissect: Modify Rejected Message
cboe_futures_orderentry_boe3_v1_0.modify_rejected_message.dissect = function(buffer, offset, packet, parent)
  if show.modify_rejected_message then
    -- Optionally add elemen


using System.Text.Json;
using System.Text.Json.Serialization;
using Xunit;

namespace PhoneNumbers.Extensions.Test
{
    public class TestConversion
    {
        private static readonly PhoneNumberUtil Util = PhoneNumberUtil.GetInstance();

        [Theory]
        [InlineData("+16194002404", "+16194002404", null)]
        [InlineData("+16194002404", "6194002404", "US")]
        [InlineData("+448443351801", "+448443351801", null)]
        [InlineData("+448443351801", "0844 335 1801", "GB")]
        [InlineData("+448443351801", "844 335 1801", "GB")]
        [InlineData("+380445004973", "+380445004973", null)]
        [InlineData("+380445004973", "0445004973", "UA")]
        [InlineData("+50022215", "+50022215", null)]
        [InlineData("+50022215", "22215", "FK")]
#if NET6_0_OR_GREATER
        public void TestSerialization(string expected, string input, string? region)
#else
        public void TestSerialization(string expected, string input, string region)
#endif
        {
            var number = Util.Parse(input, region);
            var json = JsonSerializer.Serialize(new TestPhoneNumber(number));
#if NET6_0_OR_GREATER
            var str = JsonSerializer.Deserialize<TestString>(json)!.PhoneNumber;
#else
            var str = JsonSerializer.Deserialize<TestString>(json).PhoneNumber;
#endif
            Assert.Equal(


                    return this
                }
            }
            selectedItem = currentValue
        }
    }

    override val component: JComponent by lazy {
        JPanel().apply {
            layout = GridBagLayout()

            add(label(text), gbc {
                gridx = 0
                gridy = 0
                gridwidth = 1
                gridheight = 1
                anchor = GridBagConstraints.WEST
            })

            add(componentImpl, gbc {
                gridx = 1
                gridy = 0
                gridwidth = 1
                gridheight = 1
                anchor = GridBagConstraints.WEST
            })

            add(Box.createHorizontalGlue(), gbc {
                gridx = 2
                gridy = 0
                gridwidth = 1
                gridheight = 1
                anchor = GridBagConstraints.WEST
                fill = GridBagConstraints.HORIZONTAL
                weightx = 1.0
            })
        }
    }

    @Suppress("UNCHECKED_CAST")
    override var componentValue: T
        get() = componentImpl.selectedItem as T
        set(value) {
            val oldValue = componentImpl.selectedItem

            if (value == oldValue) {
                return
            }

            if (value !in model) {
                model.insertElementAt(value, 0)
            }

            componentImpl.selectedItem = value

            if (oldValue !in selectableValues) {
                this@SelectionOption.model.removeElement(oldValue)
            }
        }

    @Suppress("UNCHECKED_CAST")
    override fun addChangeListener(listener: (T) -> Unit) {
        componentImpl.addActionListener { listener(componentImpl.selectedItem as T) }

        listener(componentImpl.selectedItem as T)
    }

    override val isModified
        get() = componentImpl.selectedItem != currentValue

    @Suppress("UNCHECKED_CAST")
    override fun apply() {
        currentValue = componentImpl.selectedItem as T
    }

    override fun reset() {
        componentValue = currentValue
    }

    override fun toString() = currentValue.name

    override fun writeString(): String {
        return currentValue.name
    }

    override fun readString(string: String) {
        currentValue = values.find { e -> e.name == string } ?: currentValue
    }
}

class SelectionValue<T>(override val option: SelectionOption<T>) :
    SimpleValueImpl<T>(option) where T : Enum<T>, T : UiValueType {
    val values
        get() = option.values

    val selectableValues
        get() = option.selectableValues
}
/*
 * FXGL - JavaFX Game Library. The MIT License (MIT).
 * Copyright (c) AlmasB (almaslvl@gmail.com).
 * See LICENSE for details.
 */

package com.almasb.fxgl.physics

import com.almasb.fxgl.core.collection.Array
import com.almasb.fxgl.core.math.FXGLMath.max
import com.almasb.fxgl.core.math.FXGLMath.min
import com.almasb.fxgl.entity.Entity
import javafx.geometry.Point2D

/**
 *
 * @author Almas Baimagambetov (almaslvl@gmail.com)
 */
internal class CollisionGrid(val cellWidth: Int, val cellHeight: Int) {

    val cells = hashMapOf<Point2D, CollisionCell>()

    fun insert(e: Entity) {
        if (e.boundingBoxComponent.hitBoxesProperty().isEmpty())
            return

        var box = e.boundingBoxComponent.hitBoxesProperty()[0]

        var minX = box.fastMinX
        var minY = box.fastMinY
        var maxX = box.fastMaxX
        var maxY = box.fastMaxY

        for (i in 1 until e.boundingBoxComponent.hit


k">

## 🏆 GitHub Trophies

## 🛡 Badges

## 👋 Olá! Eu sou o Jackson Douglas

🚀 Desenvolvedor iniciante e em transição de carreira, atualmente cursando **Análise e Desenvolvimento de Sistemas**.

💡 Apaixonado por tecnologia e sempre em busca de novos aprendizados. Meu foco atual é em **Desenvolvimento Backend (.NET/C# e Python)**, mas também tenho interesse em **Front-End**, **Banco de Dados** e **Desenvolvimento Full Stack**.

---

## 🛠 Tecnologias e Ferramentas que estou aprendendo:

- ![C#](https


    @Test
    public void testDeleteSmsChannel_success() {
        // mock 数据
        SmsChannelDO dbSmsChannel = randomPojo(SmsChannelDO.class);
        smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据
        // 准备参数
        Long id = dbSmsChannel.getId();

        // 调用
        smsChannelService.deleteSmsChannel(id);
       // 校验数据不存在了
       assertNull(smsChannelMapper.selectById(id));
        // 校验调用
        verify(smsProducer, times(1)).sendSmsChannelRefreshMessage();
    }

    @Test
    public void testDeleteSmsChannel_notExists() {
        // 准备参数
        Long id = randomLongId();

        // 调用, 并断言异常
        assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_NOT_EXISTS);
    }

    @Test
    public void testDeleteSmsChannel_hasChildren() {
        // mock 数据
        SmsChannelDO dbSmsChannel = randomPojo(SmsChannelDO.class);
        smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据
        // 准备参数
        Long id = dbSmsChannel.getId();
        // mock 方法
        when(smsTemplateService.countByChannelId(eq(id))).thenReturn(10L);

        // 调用, 并断言异常
        assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_HAS_CHILDREN);
    }

    @Test
    public void testGetSmsChannel() {
        // mock 数据
        SmsChannelDO dbSmsChannel = randomPojo(SmsChannelDO.class);
        smsChannelMapper.insert(dbSmsChannel); // @Sql: 先插入出一条存在的数据
        // 准备参数
        Long id = dbSmsChannel.getId();

        // 调用，并断言
        assertPojoEquals(dbSmsChannel, smsChannelService.getSmsChannel(id));
    }

    @Test
    public void testGetSmsChannelList() {
        // mock 数据
        SmsChannelDO dbSmsChannel01 = randomPojo(SmsChannelDO.class);
        smsChannelMapper.insert(dbSmsChannel01);
        SmsChannelDO dbSmsChannel02 = randomPojo(SmsChannelDO.class);
        smsChannelMapper.insert(dbSmsChannel02);
        // 准备参数

        // 调用
        List<SmsChannelDO> list = smsChannelService.getSmsChannelList();
        // 断言
        assertEquals(2, list.size());
        assertPojoEquals(dbSmsChannel01, list.get(0));
        assertPojoEquals(dbSmsChannel02, list.get(1));
    }

    @Test
    public void testGetSmsChannelPage() {
       // mock 数据
       SmsChannelDO dbSmsChannel = randomPojo(SmsChannelDO.class, o -> { // 等会查询到
           o.setSignature("芋道源码");
           o.setStatus(CommonStatusEnum.ENABLE.getStatus());
           o.setCreateTime(buildTime(2020, 12, 12));
       });
       smsChannelMapper.insert(dbSmsChannel);
       // 测试 signature 不匹配
       smsChannelMapper.insert(cloneIgnoreId(dbSmsChannel, o -> o.setSignature("源码")));
       // 测试 status 不匹配
       smsChannelMapper.insert(cloneIgnoreId(dbSmsChannel, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
       // 测试 createTime 不匹配
       smsChannelMapper.insert(cloneIgnoreId(dbSmsChannel, o -> o.setCreateTime(buildTime(2020, 11, 11))));
       /


        public static init() {
            if (typeof Configuration.storage === "undefined")
                Configuration.storage = new TGD.ChromeStorage();
        }

        // ===================================
        // Night Start Time
        // ===================================
        public static getNightStartHour(callback:(number)=>void):void {
            Configuration.storage.get("nightStartHour", (val:string) => {
                callback(parseInt(val));
            });
        }
        public static setNightStartHour(value:string, callback?:()=>void):void {
            Configuration.storage.set({"nightStartHour": value}, callback);
        }

        // ===================================
        // Night End Time
        // ===================================
        public static getNightEndHour(callback:(number)=>void):void {
            Configuration.storage.get("nightEndHour", (val:string) => {
                callback(parseInt(val));
            })
        }
        public static setNightEndHour(value:string, callback?:()=>void):void {
            Configuration.storage.set({"nightEndHour": value}, callback);

        }
    }
}

TGD.Configuration.init();import { Component, OnInit } from '@angular/core';

declare var suggestedPrice: any;

@Component({
  selector: 'app-suggested-price',
  templateUrl: './suggested-price.component.html',
  styleUrls: ['./suggested-price.component.css']
})
export class SuggestedPriceComponent implements OnInit {

  // Result variable that runs suggestedPrice() from suggestFunction.js
  // @param (data[], target) - target is the index (the predicted value you want)
  // @return next predicted data
  result = suggestedPrice([102.30906185448066,124.78341727880205, 97.45905483403473], 3);
  result2 = suggestedPrice([1,2,2,8,23,35,54,74,94,83], 10);
  result3 = suggestedPrice([74,94,83], 3);

  constructor() {
    console.log("2020 04 ave $");
    console.log(this.result);
    console.log("2020 04 ave G search");
    console.log(this.result3);

  }
  ngOnInit() {
  }
}export class ObjectUtils {
  /**
   * @description
   * Map an object's keys by reference.
   */
  public static keyMapping(object: { [key: string]: any }, mapping: { [key: string]: string }) {
    if (!object || !mapping) {
      return;
    }

    Object.keys(object).forEach(oldKey => {
      const newKey = mapping[oldKey];
      if (newKey) {
        object[newKey] = object[oldKey];
        delete object[oldKey];
      }
    });
  }

  /**
   * @description
   * Map an object's keys by value.
   */
  public static keyMappingImmutable<T, S>(object: T, mapping: { [key: string]: string }): S {
    if (!object || !mapping) {
      return;
    }

    return Object.keys({ ...object })
      .reduce((mapped: S, key: string) => {
        mapped[mapping[key] ?? key] = object[key];
        return mapped;
      }, {} as S);
  }

  /**
   * @description
   * Merge a key/value pair into an object if the key
   * exists in the source object.
   */
  public static mergeInto(key: string, refObject: { [key: string]: any }, mergeObject: { [key: string]: any } = {}) {
    if (!key || !refObject |